簡體   English   中英

在 macOS 上使用 Bash 遞歸重命名文件和目錄

[英]Recursively Rename Files and Directories with Bash on macOS

我正在編寫一個將執行一些操作的腳本,其中一個操作是在文件名和目錄名中查找所有出現的字符串,並將其替換為另一個字符串。

到目前為止我有這個

find . -name "*foo*" -type f -depth | while read file; do
    newpath=${file//foo/bar}
    mv "$file" "$newpath"
done

只要文件的路徑也不包含foo ,這就可以正常工作,但這不能保證。

我覺得解決這個問題的方法是只更改文件名,然后 go 回來並更改目錄名,但即便如此,如果你的結構中有多個包含foo的目錄,它不會好好工作。

有沒有辦法使用內置的 macOS 工具來做到這一點? (我說是內置的,因為這個腳本將分發給我們組織中的其他一些人,它不能依賴任何要安裝的包)。

將 path_name 與 file_name 分開,類似於。

#!/usr/bin/env bash

while read -r file; do
  path_name="${file%/*}"; printf 'Path is %s\n' "$path_name"
  file_name="${file#"$path_name"}"; printf 'Filename is %s\n' "$file_name"
  newpath="$path_name${file_name//foo/bar}"
  echo mv -v "$file" "$newpath"
done < <(find . -name "*foo*" -type f)

看看basenamedirname以及。

printf只是用來顯示路徑和文件名。

該腳本只是將文件名中的foo替換為bar ,也可以使用路徑名來完成,只需使用相同的語法即可。

newpath="${path_name//bar/more}${file_name//foo/bar}"

所以重命名 path_name 和 file_name。

或者重命名 path_name 然后像您的想法一樣重命名 file_name 也是一個選項。

path_name="${file%/*}"
file_name="${file#"$path_name"}"
new_pathname="${path_name//bar/more}"

mv -v "$path_name" "$new_pathname"

new_filename="${file_name//foo/bar}"

mv -v "${new_pathname%/*}$file_name" "$new_pathname$new_filename"

除了腳本使用的工具/實用程序之外,沒有使用其他外部工具/實用程序。

如果您對結果/輸出感到滿意,請刪除echo

您可以使用-execdir相關目錄中的文件名(基名)運行命令:

find . -depth -name '*foo*' -execdir bash -c 'mv -- "${1}" "${1//foo/bar}"' _ {} \;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM