Find

使用輸入列表和部分文件路徑查找和復製文件

  • April 5, 2019

我有一個names.list僅包含名稱的文件名列表。這些文件分散在我的系統中的各個子文件夾中,但結構通常是

uniquename/uniquename2/spades/filtered/filename

常數是spades/filtered

從一個目錄移動文件時,我使用了以下命令

xargs -a file_list.txt cp -t /path/to/dest

我在使用萬用字元/部分文件名時發現了這個執行緒

find . -path \*content/docs/file.xml

我試著像這樣組合它們

find . -path \*spades/filtered/ | xargs -a names.list cp -t $HOME/destination/

但我收到以下錯誤:

cp: cannot stat `filename': No such file or directory

tldr:我想複製文件,只輸入名稱列表和部分文件路徑

通過 for 循環遍歷文件名並將它們附加到查找模式,使用 exec 句柄複製:

for i in $(<names.list)
do
   find . -path \*spades/filtered/"$i" -type f -exec cp -t "$HOME/destination/" {} \;;
done

編輯:感謝 Rakesh Sharma 的回答,將循環體替換為:

find . -mindepth 5 -maxdepth 5 -path "*/spades/filtered/$i" -type f -exec cp -t "$HOME/destination/" {} +;

加快速度。

您可以取消for循環並在以下範圍內執行所有操作xargs

xargs -a names.list -L 1 -I @ find . -path \*/spades/filtered/@ -type f -exec cp -fpvt "$HOME/destination/" {} +

假設 GNU xargs、find 和 cp 實用程序。

-a將一次讀取一行文件名。

-L 1選項xargs將一個換行符分隔的參數傳遞給 find。

-I @option 將在符號中壓縮該參數,該符號@可以卡在由 呼叫的實用程序中xargs,在這種情況下,find。更具體地說,對於讀取的每一行 names.list ,該-path選項find由符號修改。@

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