リストに基づいてすべてのファイルをあるフォルダから別のフォルダに移動します。

リストに基づいてすべてのファイルをあるフォルダから別のフォルダに移動します。

Aあるフォルダから別のフォルダに移動したいファイルのリストがありますが、B手動で移動したくありません。リストを繰り返して、そのリスト内の各ファイルを移動する簡単な方法はありますか?

答え1

rsyncファイルのリストが1行に1つのファイル名であると仮定すると、を使用してファイルを移動できます。

rsync -av --remove-source-files --files-from filelist.txt sourceDir/ targetDir/

ファイルが絶対名(つまり、名前がで始まる場合/)の場合はsourceDir、必ずしなければなりません/。それ以外の場合は、ルートの相対名でなければなりません。

はい

$ mkdir src dst
touch src/{one,two,three}
$ cat >filelist.txt <<EOF
one
two
EOF

$ ls src
one  three  two
$ ls dst

$ rsync -av --files-from filelist.txt --remove-source-files src/ dst/
building file list ... done
one
two

sent 165 bytes  received 70 bytes  470.00 bytes/sec
total size is 0  speedup is 0.00

$ ls src
three
$ ls dst
one  two

答え2

GNUコアユーティリティ(またはこれらの特定の機能を含む他の実装)を提供している場合は、それを使用してファイルリストにxargs基づいてパラメータリストを作成できます。mv

cd A
xargs -rd '\n' -- mv -t B -- < file-list.txt

GNUユーティリティがない場合でも、読み込み中にループを使用できます。 Bashでは、次のようになります。

while IFS= read -r file; do
    mv "A/$file" "B/$file"
done < file-list.txt

答え3

この問題を簡単に解決できますウィム以下の簡単な手順10に従ってください。

  1. ViMで長いファイル名のリストを開きます。
  2. qa「a」というマクロ記録を開始するには、入力してください。
  3. y$ファイル名を抽出(コピー)するには、入力してください。
  4. imv A/ファイル名の前に「mv A /」と入力してキーを押しますEscape
  5. A B/行の末尾に「B /」と入力して書き、を押しますEscape
  6. pj^ファイル名を貼り付けて次の行の先頭に移動するには、入力してください。
  7. マクロの記録を停止するにはタップしますq
  8. VG:normal @aファイルの最後まで「a」マクロを再生するには、入力してください。
  9. :wq rename.sh"rename.sh"というbashスクリプトで保存して終了するには、入力してください。
  10. 最後に、bashプロンプトでchmod +x rename.sh; ./rename.shスクリプトを実行可能としてマークを入力して実行します。

答え4

これはループを使用しないPOSIX準拠のバリエーションです。項目はfile-list.txt改行で区切られます。

cd A ; xargs -I{} -- mv -- {} B < file-list.txt

明らかに、このバリアントではファイル名に改行文字を含めることはできません。また、mv各ファイルに対して個別にコマンドを呼び出します。

これデビッドポスターの変種.xargs複数のmv引数に対して単一のインスタンスを呼び出し、長い mvファイルリストの方が効率的です。それでもファイル名に改行文字を含めることはできません。これらの制限を克服するには、このオプションを使用して-0ファイル名を(NULL)文字で区切ることができます。\0

cd A ; xargs -r0 -- mv -t B -- < file-list.txt

関連情報