簡體   English   中英

在 Linux 中查找並復制包含模式的多個文件

[英]FInd and copy multiple files that contain a pattern in Linux

當我需要在同一個目錄中復制多個文件時,我可以:

  • cp文件{20..30} newLocation

但是當我將它與 find 結合起來時,它不起作用。

  • 尋找 。 -name '文件{20..30} ' -exec cp '{}' newLocation ';'

我究竟做錯了什么?

{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 ,以便進行文件復制。


或者只是使用globstarnullglob '

#!/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.

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