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