如何移動數百個檔案名稱關鍵字(ID)列在文字檔案中的檔案?

如何移動數百個檔案名稱關鍵字(ID)列在文字檔案中的檔案?

我需要移動數百個文件,其名稱中包含 ID 號,並且這些號碼在文字檔案中逐行列出。

例如:

The content of `ID.txt`:

1231245
1435466
3454656
3356646

我需要移動的文件:

1231245_134.fasta
1231245_134.dna
1435466_345.fasta
1435466_345.dna
3454656_789.fasta
3454656_789.dna
3356646_104.fasta
3356646_104.dna

答案1

怎麼樣(如果你的 shell 提供「進程替換」)

. <(sed 's/^/echo mv /; s/$/* \/target/' ID.txt)

如果對結果滿意,請刪除迴聲。

編輯(由斯特凡·查澤拉斯提議)

sed 's|.*|mv -- &_* /target/|' ID.txt | sh -v -n

-n如果對結果滿意,請刪除。

答案2

假設檔案名稱不包含空格、換行符、反斜線或引號,並且像 ksh、zsh 或 bash 這樣的 shell 支援進程替換,您可以這樣做:

join -t_ <(printf '%s\n' *_* | sort -t_ -k1,1) <(sort ID.txt) |
  xargs sh -c 'exec mv -- "$@" /target' sh

答案3

  • 您可以提供與 中的表達式相符的grep參數,每行一個。-f FILEFILE
  • ID.txt需要稍微修改一下,sed以便它只完全匹配您想要的內容:^每行開頭的 a 以使數字匹配行開頭的數字,而_結尾的數字則不123匹配123123_
  • ls -1將每行列出一個文件。
  • xargs -I FOOBAR用輸入行取代出現的 FOOBAR,而不是附加輸入行。

所以:

sed -e 's/^/^/' -e 's/$/_/' /path/to/ID.txt > /tmp/ID_regexp.txt
cd /old/dir
ls -1 | grep -f /tmp/ID_regexp.txt | xargs -I FILE mv FILE /new/dir

答案4

bash解:

while IFS= read -r p; do mv ${p}* /target; done < ID.txt
  • < ID.txt將文件作為輸入
  • while IFS= read -r p緩慢地穿過線路
    • mv ${p}* /target將檔案中以編號開頭的所有檔案移至/target目錄中。

您可以echo在命令前面寫入mv來控制將執行哪些命令:

$ while IFS= read -r p; do echo mv ${p}* /target; done < ID.txt
mv 1231245_134.dna 1231245_134.fasta /target
mv 1435466_345.dna 1435466_345.fasta /target
mv 3454656_789.dna 3454656_789.fasta /target
mv 3356646_104.dna 3356646_104.fasta /target

相關內容