ファイル名キーワード(ID)がテキストファイルにリストされている何百ものファイルを移動する方法は?

ファイル名キーワード(ID)がテキストファイルにリストされている何百ものファイルを移動する方法は?

名前にID番号があり、その番号がテキストファイルに1行ずつリストされている何百ものファイルを移動する必要があります。

たとえば、

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

(シェルが「プロセス置換」を提供している場合)どうですか?

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

結果が満足な場合は、エコーを削除してください。

編集する(Stefan Chazerasが提案)

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

-n結果が満足であれば削除してください。

答え2

ファイル名にスペース、改行、バックスラッシュ、または引用符が含まれておらず、ksh、zsh、bashなどのシェルがプロセス置換をサポートしていると仮定すると、次のことができます。

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

答え3

  • の式に一致するパラメータを1grep行に1つずつ指定できます。-f FILEFILE
  • ID.txtsed必要なものと正確に一致するように少し変更する必要があります。^各行の先頭から行の先頭の数字は一致しますが、_末尾の数字は123一致しません123123_
  • ls -11行に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

関連情報