Directory

遞歸地將文件夾重命名為@eaDir

  • September 18, 2020

我正在嘗試使用我在 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 {} +

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