ファイルリスト別にフォルダ内のファイルを移動する

ファイルリスト別にフォルダ内のファイルを移動する

.txtフォルダのリストを含むファイルがあります。

old_folder_path1,new_folder_path1
old_folder_path2,new_folder_path2
old_folder_path3,new_folder_path3

シェルコマンドを実行して、各フォルダシリーズのファイルを古いフォルダから新しいフォルダに移動したいと思います。また、サブフォルダは上書きまたは移動されず、各フォルダ内のファイルのみが移動されます。

.txt必要に応じてファイルに対応するようにファイルの構文を変更できます。

答え1

使用rsync:

while IFS=, read -r src dest; do
    [ ! -d "$src" ] && echo "skipping missing directory \"$src\"" >&2 && continue
    mkdir -p "$dest" && rsync -av --exclude='*/' --remove-source-files --ignore-existing "$src/" "$dest"
done < file.txt

スクリプトはfile.txt1行ずつ読み込み、ソースディレクトリとターゲットディレクトリを変数srcsumに割り当てますdest。行IFSは(内部フィールド区切り文字)変数で定義されているコンマで区切られます。ディレクトリでない場合、srcwhileループは次の行から続行されます。そうでなく、宛先ディレクトリがない場合は、宛先ディレクトリと対応する親ディレクトリが作成されます。

rsync通話中に次のオプションを使用してください(参照man rsync)。

  • -aアーカイブモード(オプションの略-rlptgoD
  • -v詳細モード
  • --exclude='*/'ディレクトリを除いて、ディレクトリではなくディレクトリのみを転送する
  • --remove-source-files転送完了後、送信側からファイルを削除します。 (例mv:)
  • --ignore-existingターゲットにすでに存在するファイルを転送しない

スクリプトをシェルスクリプトとして保存できますmv_rsync.sh

#!/bin/sh

[ $# -ne 1 ] && echo "invalid file argument" >&2 && exit 1
while IFS=, read -r src dest; do
    [ ! -d "$src" ] && echo "skipping missing directory \"$src\"" >&2 && continue
    mkdir -p "$dest" && rsync -av --exclude='*/' --remove-source-files --ignore-existing "$src/" "$dest"
done < "$1"

実行可能にする

chmod +x ./mv_rsync.sh

次のように実行します。

./mv_rsync.sh file.txt

関連情報