
我正在嘗試將幾個帶有空格的 .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
其中不包含模式的檔案名稱。然而,在您的情況下,由於您正在通過管道傳輸到grep
from 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
。