パスを保持/作成しながら、テキストファイルにリストされているファイルを移動します。

パスを保持/作成しながら、テキストファイルにリストされているファイルを移動します。

各ファイルを表す1行のフルパスを含むファイルのリストを含むテキストファイルがあります。たとえば、ファイルの最初の行は次のようになります。

/mnt/data/data4/1998/reports/First Quarter.docx

すべてのファイルは、「data4」部分(たとえば/mnt/data/data4)まで同じパスを共有します。私が望むのは、各ファイルを別のドライブに移動することです。たとえば、上記のファイルは次に移動されます。

/mnt/data/data11/1998/reports/First Quarter.docx

パスの「data11」部分は変更されずに残り、すべてのファイルの既存のパスの「data4」を置き換えます。テキストファイルとファイル名にスペースがあります。 /data11 次の宛先パス部分が既に存在する場合もありますが、存在しない場合もあります。

私はこれを1行で行うことができると思いますsedが、それをよく理解してxargsいないようです。mvどんなアドバイスも本当にありがとうございます。

答え1

使用rsync:

synclist=$(mktemp)
sed 's,^/mnt/data/data4/,,' filelist.txt > "$synclist"
rsync -avh --files-from="$synclist" --remove-source-files /mnt/data/data4/ /mnt/data/data11/
rm "$synclist"
  1. 一時ファイルを作成し、それを変数に割り当てますsynclist
  2. /mnt/data/data4/すべての行からプレフィックスを削除し、filelist.txt出力を一時ファイルに保存します。
  3. $synclist/mnt/data/data4/ででファイル(現在の相対パス)を同期します/mnt/data/data11/--remove-source-files転送後にソースファイルを削除するオプション(に似ていますmv
  4. 一時ファイルを削除します。

関連情報