%20%E3%81%8C%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%AA%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E6%95%B0%E7%99%BE%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
名前に 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 FILE
FILE
ID.txt
sed
を少し変更して、必要なものだけと一致するようにする必要があります。^
つまり、各行の先頭に a を付けて、数字が行の先頭と_
行末に一致するようにします。こうすると、 a は と123
一致しなくなります。123123_
ls -1
1 行に 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