[英]FInd and copy multiple files that contain a pattern in Linux
當我需要在同一個目錄中復制多個文件時,我可以:
但是當我將它與 find 結合起來時,它不起作用。
我究竟做錯了什么?
{20..30}
范圍語法是 Bash 命令行解析器的一個特殊功能。 它不是標准 POSIX globbing 的一部分,例如find
的-name
測試執行,並且在您可能喜歡的某些上下文中,Bash 甚至無法識別它。
您已經知道我會為您的示例案例推薦的更簡單、更直接的替代方案。 你也可以做類似的事情
find . '(' -name 'file2[0-9]' -o -name file30 ')' -exec cp '{}' newLocation ';'
,但如果范圍的端點是動態確定的,則效果不佳。
如果使用find
是為了避免一些不存在的文件引起的問題,那么您可以考慮像這樣解決它:
for f in file{20..30}; do
[[ -e "$f" ]] && cp "$f" newLocation
done
正如其他帖子/答案中所述,用(
和結束)
加上-o
和-name
將名稱-name
起來。
像這樣的東西應該能夠從您的輸入文件/字符串中添加這些字符串。
#!/usr/bin/env bash
format() {
local f
declare -ag files
for f; do
files+=( -o -name "$f" )
done
}
format file{10..20}
現在檢查"${files[@]}"
declare -p files
輸出
declare -a files=([0]="-o" [1]="-name" [2]="file10" [3]="-o" [4]="-name" [5]="file11" [6]="-o" [7]="-name" [8]="file12" [9]="-o" [10]="-name" [11]="file13" [12]="-o" [13]="-name" [14]="file14" [15]="-o" [16]="-name" [17]="file15" [18]="-o" [19]="-name" [20]="file16" [21]="-o" [22]="-name" [23]="file17" [24]="-o" [25]="-name" [26]="file18" [27]="-o" [28]="-name" [29]="file19" [30]="-o" [31]="-name" [32]="file20")
看看當用作find
的輸入時它會是什么樣子
printf '%s\n' "\( ${files[*]} \)"
輸出
\( -o -name file10 -o -name file11 -o -name file12 -o -name file13 -o -name file14 -o -name file15 -o -name file16 -o -name file17 -o -name file18 -o -name file19 -o -name file20 \)
將該數組files
用作find
的輸入
find . -type f \( "${files[@]:1}" \) -exec bash -c 'echo cp -v -- "$@" /destination' _ {} +
"${files[@]:1}"
刪除前導-o
如果您對輸出感到滿意,請刪除echo
,以便進行文件復制。
或者只是使用globstar
和nullglob
'
#!/usr/bin/env bash
shopt -s globstar nullglob
cp -v ./**/file{10..20} /destination
前導./
表示當前目錄,可以是
/path/to/source/**/file{10..20}
其中/path/to/source/
是相關文件所在的目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.