400以上の画像を含むディレクトリがあります。それらのほとんどは破損しています。私は良いものを特定しました。それらはテキストファイルにリストされています(100以上あります)。それらを一度にBASHの別のディレクトリに移動するにはどうすればよいですか?
これを行うには、すぐに頭に浮かぶいくつかの方法があります。
ファイル名が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/
高速ソリューション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つのジョブを実行します。
1行に1つのファイル名がある場合:
xargs -d \\n echo mv -t /target/directory
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