Find

為什麼 find 和 exec mv 不移動所有文件?

  • August 24, 2021

目前工作目錄有多個編號在 1 到 100 之間的測試文件。這些文件的標題1.txt100.txt.

該命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec bash -c 'mv "$@" "TestDir - Level One"' {} +將所有文件移動一個,例如15.txt.

相反,該命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec mv {} "TestDir - Level One"/ \;移動所有文件。

如果find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec bash -c 'mv "$@" "TestDir - Level One"' {} +再次執行該命令,則返回錯誤mv: missing destination file operand after 'TestDir - Level One' Try 'mv --help' for more information.

的版本findfind (GNU findutils) 4.7.0-git

您缺少將$0字元串分配給bash -c '…'呼叫。呼叫的第一個參數find被分配給$0(shell 的名稱)而不是,$1因此不會被移動。

-c     如果-c存在該選項,則從第一個非選項參數 command_string 中讀取命令。如果在 command_string 之後有參數,則將第一個參數分配給位置參數,$0並將任何剩餘的參數分配給位置參數。賦值$0設置 shell 的名稱,用於警告和錯誤消息。

(強調我的)

將您的命令更改為

find . [more find options…] -exec bash -c 'mv "$@" "TestDir - Level One"' bash {} +

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