ファイル名のキーワード (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)

結果に満足したらエコーを削除します。

編集(ステファン・シャゼラス提案)

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

  • 内の表現と一致するgrep引数を1 行に 1 つずつ指定できます。-f FILEFILE
  • ID.txtsedを少し変更して、必要なものだけと一致するようにする必要があります。^つまり、各行の先頭に a を付けて、数字が行の先頭と_行末に一致するようにします。こうすると、 a は と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

関連情報