テキストファイルで指定されたファイルをBASHの他のディレクトリに移動するには? [コピー]

テキストファイルで指定されたファイルをBASHの他のディレクトリに移動するには? [コピー]

400以上のイメージを含むディレクトリがあります。それらのほとんどは腐敗しました。私は良いことを見つけました。テキストファイルとして一覧表示されます(100以上)。 BASHの別のディレクトリに一度に移動するにはどうすればよいですか?

答え1

私はすぐにこれを行ういくつかの方法を考えました。

  1. whileループの使用
  2. xargsの使用
  3. rsyncの使用

ファイル名が1行に1つずつリストされており、files.txtそれをサブディレクトリから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/

答え2

早くGNUソリューションparallel:

私たちが言う「いいね」イメージファイル名はfileにリストされ、ターゲット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

1行にファイル名が1つしかない場合:

xargs -d \\n echo mv -t /target/directory

答え4

Bashソリューションを要求すると、実際にはコマンドラインベースのソリューションを意味します。他の人持つもし使うタイプコマンドラインツール。以下はbash組み込み機能を使用するソリューションです(配列/マップファイルの読み取り)はテキストファイルの内容を読み取り、これらのファイル名をコマンドに渡します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

関連情報