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に従ってください。
- ViMで長いファイル名のリストを開きます。
qa
「a」というマクロ記録を開始するには、入力してください。y$
ファイル名を抽出(コピー)するには、入力してください。imv A/
ファイル名の前に「mv A /」と入力してキーを押しますEscape
。A B/
行の末尾に「B /」と入力して書き、を押しますEscape
。pj^
ファイル名を貼り付けて次の行の先頭に移動するには、入力してください。- マクロの記録を停止するにはタップします
q
。 VG:normal @a
ファイルの最後まで「a」マクロを再生するには、入力してください。:wq rename.sh
"rename.sh"というbashスクリプトで保存して終了するには、入力してください。- 最後に、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