Bash

帶有 cp 和 grep 的詳細 bash 腳本不適用於文件名中的空格

  • July 1, 2022

我自己永遠不會這樣做,但使用 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/

任何想法如何使這項工作?

使用findandxargs代替$(...)參數擴展:

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。)

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