Command-Line

如何在 find 命令的額外 -exec 選項中表達所有文件/目錄?

  • January 16, 2015

我的任務是將具有特殊名稱的多個目錄中的所有文件複製到目標目錄。

所以我建立了這個目錄來測試我的命令。測試目錄樹如下所示:

.
├── dir1
│   └── file1
└── test

我打算將 dir1 中的所有文件 mv 到測試的命令是:

find . -type d -name "*dir*" -exec mv {}/* test \;

然後我得到:

mv: rename ./dir1/* to test/*: No such file or directory

我猜這是因為在那個額外的 -exec 表達式中,該命令沒有將 * 視為萬用字元。

所以我做了:

find . -type d -name "*dir*" -exec mv {}/file1 test \;

哪個成功移動 file1 進行測試。

但關鍵是,我現在需要所有文件的表達式,這樣我才能完成這個文件傳輸工作。

我應該如何在find -exec命令組中表達?

mv "$dir_path"/* ...不僅會移動文件,還會移動"$dir_path". 至少名稱不以點開頭的所有內容(隱藏文件)。在 bash 中,您可以使用選項更改它dotglob。但是,如果*擴展得很好(匹配所有內容,但對於命令行來說不是太多),那麼您可以使用 shell 進行間接定址:

find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \;

嘗試:

$ find -type d -name '*dir*' -exec sh -c '
 for d do
   for f in "$d"/*; do
     [ -f "$f" ] && mv -- "$f" /path/to/test
   done
 done
' sh {} +

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