Bash
帶有 cp 和 grep 的詳細 bash 腳本不適用於文件名中的空格
我自己永遠不會這樣做,但使用 Windows 機器的人堅持在文件名中添加空格。
我已經編寫了這個詳細的命令,除了帶有空格的文件外,它工作得很好。已經嘗試了一切,單引號,雙引號,刻度,反斜杠轉義。
該命令應該從具有某些文件副檔名的目錄中複製所有內容,但我不想複製的文件列表除外。不幸的是,其中一些文件包含空格。這是命令:
cp $(ls *.txt *.docx | grep --invert-match --fixed-strings \ -e not_this_one.txt \ -e not_this_one_either.docx \ -e "no not me.txt" \ -e "please leave me out as well.docx") ./destination_directory/
任何想法如何使這項工作?
使用
find
andxargs
代替$(...)
參數擴展:find *.txt *.docx \( \ -name not_this_one.txt \ -o -name not_this_one_either.docx \ -o -name 'no not me.txt' \ -o -name "please leave me out as well.docx" \ \) -prune -o -print0 | xargs -0 cp -t /tmp/destination_directory
我們使用該
-prune
選項來排除我們不想複製的內容。我們
-print0
在 find 命令上使用來生成以 NUL 結尾的文件名,當通過管道傳送到xargs -0
正確處理包含空格的文件名時。最後,我們使用
-t <target_directory>
on 選項,cp
因為這允許xargs
僅將文件名列表附加到命令(沒有-t
,目標目錄需要放在最後,這會使事情變得有點複雜)。或者,使用
tar
:tar -cf- \ --exclude=not_this_one.txt \ --exclude='not_this_one_either.docx' \ --exclude='no not me.txt' \ --exclude='please leave me out as well.docx' *.txt *.docx | tar -C /tmp/destination_directory -xf-
(當然,您可以將排除模式列表放入文件中並使用
--exclude-from
。)