Find

zsh find -execdir rename ‘沒有這樣的文件或目錄’

  • May 21, 2021

我正在嘗試在 MacOS Big Sur 上編寫一個 zsh 腳本,它將遞歸地重命名一些具有我不想要的特殊字元的文件和目錄。玩了好幾天,每次我認為我已經破解了,我都會遇到一個新問題。它基本上完成了,除了當我在空執行模式下執行 find 命令時:

find . -d -type f -execdir rename -n -X ${=CHARACTER_SUBSTITUTIONS} {} +

我在我的測試文件夾中獲得了正確的文件列表:

‘無標題文件3

$$ $$.txt’ 將被重命名為 ‘untitled file3 –.txt’

‘untitled file2.$$ $$.txt’ 將被重命名為 ‘untitled file2. - 。文本​​’

但是當我執行它時,它再也找不到它們了:

find . -d -type f -execdir rename -X ${=CHARACTER_SUBSTITUTIONS} {} +

結果:

無法重命名“無標題文件 3”

$$ $$.txt’ to ‘untitled file3 –.txt’: No such file or directory

Can’t rename’untitled file2.$$ $$.txt’到’無標題文件2。–.txt’:沒有這樣的文件或目錄

把我的頭撞在牆上。任何幫助將不勝感激。

如果它是相關的,CHARACTER_SUBSTITUTIONS 只是我想要製作的一長串潛艇。

echo ${=CHARACTER_SUBSTITUTIONS}
-S [ - -S ] - -S + - -S # - -S % - -S { - -S } - -S \ - -S < - -S > - -S * - -S ? - -S $ - -S ! - -S : - -S @ - -S ` - -S | - -S ' - -S " - -S & - -S  - -S = -

詳細資訊:

zsh

MacOS Big Sur

rename v1.601(基於 Perl 的變體之一)

由於您使用的是 Zsh,因此我將只使用zmv它而不是find

% autoload -Uz zmv
% zmv -n '(**/)(*)(#q.)' '$1${2//[^. [:IDENT:]]/-}'  # -n: no execute
mv -- 'untitled file2 [].txt' 'untitled file2 --.txt'
mv -- 'untitled file3 [].txt' 'untitled file3 --.txt'
% zmv -v '(**/)(*)(#q.)' '$1${2//[^. [:IDENT:]]/-}'  # -v: verbose
mv -- 'untitled file2 [].txt' 'untitled file2 --.txt'
mv -- 'untitled file3 [].txt' 'untitled file3 --.txt'
% 

[^. [:IDENT:]]匹配任何不是點、空格或 shell 標識符的有效部分的內容。(#q.)是將重命名限制為正常文件,例如您的-type f.

欲了解更多資訊:

引用自:https://unix.stackexchange.com/questions/650492