各ファイルを表す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"
- 一時ファイルを作成し、それを変数に割り当てます
synclist
。 /mnt/data/data4/
すべての行からプレフィックスを削除し、filelist.txt
出力を一時ファイルに保存します。$synclist
/mnt/data/data4/
ででファイル(現在の相対パス)を同期します/mnt/data/data11/
。--remove-source-files
転送後にソースファイルを削除するオプション(に似ていますmv
)- 一時ファイルを削除します。