Directory
遞歸地將文件夾重命名為@eaDir
我正在嘗試使用我在 GitHub 上找到的縮略圖生成器 python 腳本,它非常有效。
它會在名為 的文件夾中生成縮略圖
eaDir_temp
,然後需要在 NAS 上將其重命名為@eaDir
來自終端。作者為此提供了一個命令:find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;
不幸的是,對於每個包含照片的子文件夾,它會返回:
mv: cannot move ‘./subfolder/eaDir_tmp’ to ‘@eaDir/eaDir_tmp’: Directory not empty
我應該怎麼做?
對於好奇的人,可能會發生什麼:命令
find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;
將它找到的每個
./whatever/eaDir_tmp
目錄(即eaDir_tmp
組件)移動到目前工作目錄:./whatever/eaDir_tmp
→./@eaDir
。(因為@eaDir
被視為mv
相對於目前工作目錄的路徑組件)。第一次,這會創建
./@eaDir
,如果它還不存在的話。找到的第二個
./whatever/eaDir_tmp
被移入*,*./@eaDir
因為此時mv
(@eaDir
) 的目標目錄存在:./whatever/eaDir_tmp
→./@eaDir/eaDir_tmp
。進一步
./subfolder/eaDir_tmp
找到也被移入./@eaDir
,而這一步失敗,因為./@eaDir/eaDir_tmp
已經存在且不為空。您可以做什麼:如果您的
find
實現支持該-execdir
操作:find . -depth -type d -name 'eaDir_tmp' -execdir mv '{}' @eaDir \;
-depth
實際上只有在嵌套eaDir_tmp
目錄的情況下才需要(例如./whatever/eaDir_tmp/whatever/eaDir_tmp
)。與 相反
-exec
,-execdir
從包含匹配文件的目錄(而不是從find
的目前工作目錄)執行指定的命令。如果您
find
不支持非標準-execdir
:find . -depth -type d -name 'eaDir_tmp' \ -exec sh -c 'mv "$1" "${1%/*}/@eaDir"' mysh {} \;
或者,為了避免為每個找到的目錄啟動一個 shell:
find . -depth -type d -name 'eaDir_tmp' -exec sh -c ' for dir do mv "$dir" "${dir%/*}/@eaDir" done' mysh {} +