web-dev-qa-db-ja.com

テキストファイルで指定されたファイルをBASHの別のディレクトリに移動する方法

400以上の画像を含むディレクトリがあります。それらのほとんどは破損しています。私は良いものを特定しました。それらはテキストファイルにリストされています(100以上あります)。それらを一度にBASHの別のディレクトリに移動するにはどうすればよいですか?

4
Weylyn Savan

これを行うには、すぐに頭に浮かぶいくつかの方法があります。

  1. Whileループの使用
  2. Xargsの使用
  3. Rsyncの使用

ファイル名がfiles.txtにリストされ(1行に1つ)、それらをサブディレクトリsource/からサブディレクトリtargetに移動するとします。

Whileループは次のようになります。

while read filename; do mv source/${filename} target/; done < files.txt

Xargsコマンドは次のようになります。

cat files.txt | xargs -n 1 -d'\n' -I {} mv source/{} target/

そして、rsyncコマンドは次のようになります。

rsync -av --remove-source-files --files-from=files.txt source/ target/

サンドボックスを作成して、各アプローチを実験してテストすることは価値があるかもしれません。例:

# Create a sandbox directory
mkdir -p /tmp/sandbox

# Create file containing the list of filenames to be moved
for filename in file{001..100}.dat; do basename ${filename}; done >> /tmp/sandbox/files.txt

# Create a source directory (to move files from)
mkdir -p /tmp/sandbox/source

# Populate the source directory (with 100 empty files)
touch /tmp/sandbox/source/file{001..100}.dat

# Create a target directory (to move files to)
mkdir -p /tmp/sandbox/target

# Move the files from the source directory to the target directory
rsync -av --remove-source-files --files-from=/tmp/sandbox/files.txt /tmp/sandbox/source/ /tmp/sandbox/target/
6
igal

高速ソリューションGNU parallel

「良い」画像ファイル名がファイルgood_img.txtにリストされていて、宛先フォルダの名前がgood_imagesであるとします。

cat good_img.txt | parallel -m -j0 --no-notice mv {} good_images 
  • -m-コマンドラインの長さが許す限り多くの引数を挿入します。複数のジョブが並行して実行されている場合:ジョブ間で引数を均等に分散します

  • -j N-ジョブスロットの数。最大N個のジョブを並行して実行します。 0はできるだけ多くを意味します。デフォルトは100%で、CPUコアごとに1つのジョブを実行します。

3
RomanPerekhrest

1行に1つのファイル名がある場合:

xargs -d \\n echo mv -t /target/directory
1
Hauke Laging

Bashソリューションを要求したが、実際にはコマンドラインベースのソリューションを意味していた可能性がある。 その他 持っている 提供されているさまざまな コマンドラインツールを使用する。次に、bashビルトイン( readarray/mapfile )を使用してテキストファイルの内容を読み取り、それらのファイル名をmvコマンドに渡すソリューションを示します。

セットアップ

$ touch {a..z}.jpg "bad one.jpg" "good one.jpg"
$ mkdir good
$ cat saveus
j.jpg
good one.jpg
z.jpg

準備

$ readarray -t < saveus.txt
$ declare -p MAPFILE
declare -a MAPFILE='([0]="j.jpg" [1]="good one.jpg" [2]="z.jpg")'

やれ

$ mv -- "${MAPFILE[@]}" good/

確認

$ ls -1 good/
good one.jpg
j.jpg
z.jpg
$ ls "good one.jpg" j.jpg z.jpg
ls: cannot access good one.jpg: No such file or directory
ls: cannot access j.jpg: No such file or directory
ls: cannot access z.jpg: No such file or directory
1
Jeff Schaller