mv 抱怨使用 grep 過濾檔案名稱的管道中的標準輸入

mv 抱怨使用 grep 過濾檔案名稱的管道中的標準輸入

我正在嘗試將幾個帶有空格的 .avi 檔案從 CD 移動到我的主資料夾中。我已經知道如何去除空格:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

但我正在努力尋找已編輯的文件並將它們一起移動到資料夾中。我不斷收到錯誤訊息mv: cannot stat '(standard input)': No such file or directory。這是我嘗試使用的程式碼:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

有人可以告訴我我做錯了什麼嗎?

答案1

你的問題是-L切換到grep.從手冊頁:

L, --files-without-match
禁止正常輸出;相反,列印每個通常不會列印輸出的輸入檔案的名稱。掃描將在第一個匹配處停止。

所以而不是列出檔案名稱不匹配的avi僅列出地方哪裡grep沒找到avi。由於grep通常在檔案中查找,因此這樣的開關將列出avi其中不包含模式的檔案名稱。然而,在您的情況下,由於您正在通過管道傳輸到grepfrom find,因此正在讀取的檔案grep(standard input).要明白我的意思,請試試:

find /media/mathscd | grep -L "*.avi"

結果:

(standard input)

換句話說,grep發現行"*.avi"與標準輸入不匹配,而這正是發生的情況。

由於find直接列出檔案名,因此只需反轉匹配的含義:

find /media/mathscd | grep -v ".*\.avi"

(請注意,grep模式與 shell 通配符不同;您也不需要開關-r

另外,find單獨使用:

find /media/mathscd ! -name "*.avi"

答案2

試試以下其中一項:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

確保首先替換為進行xargs mv*測試xargs ls

相關內容