簡體   English   中英

如何從包含部分文件名的列表中 -find -exec cp 文件

[英]How to -find -exec cp files from a list containing a portion of the filename

我已經搜索了很長時間,但找不到有效的答案。 我有一個包含部分文件名的列表(文件名的前幾個字母)。 如果我按如下方式單獨放置文件名,它會起作用:

find ~/directory/to/search -name "filename*" -print -exec cp '{}' ~/directory/to/copyto \;

如果我嘗試在這種情況下包含列表,它不會:

cat ~/directory/List.txt | while read line 
do 
echo "Text read from file - $line" 
find ~/directory/to/search -name "$line*" -type f
done

這也不行:

cat ~/directory/List.txt | while read line 
do 
echo "Text read from file - $line" 
find ~/directory/to/search -name "$line&*" -type f
done

最后,我想補充:

-exec cp '{}' ~/directory/to/copy/to \;

並復制所有符合查找條件的文件。

我試過使用 grep,但文件很大,所以需要很長時間。 我嘗試使用之前搜索中讀取的 find、xargs、cp、grep 和 regex 的各種組合,但沒有運氣。

是用一堆 if then 語句編寫長腳本的唯一解決方案嗎? 我一直在使用 Linux,但在 mac 上使用它也會很酷。

這是一個粗略的嘗試,以擺脫單個find調用。

predicates=()
or=''
while read -r line; do
    predicates+=($or -name "$line*")
    or="-o"
done < ~/directory/list.txt
find ~/directory/to/search -type f \( "${predicates[@]}" \) \
    -exec cp -t ~/directory/to/copy/to {} + 

數組功能需要具有此功能的擴展外殼(Bash、 ksh等); 它不適用於/bin/sh

cp -t是一個 GNU 擴展; 如果你沒有那個,也許只是使用你原來的-exec cp {} dir \\; 雖然效率會降低。 一些舊版本的find也不支持-exec ... +

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM