これは私の現在のコードです。
Base_DIR=/file/path
other= /folder/path
find "Base_DIR" -type f -name "*.txt"
while IFS= read -r file; do
year="$(date -d "$(stat -c %y "$file")" +%Y
month="$(date -d "$(stat -c %y "$file")" +%m
day="$(date -d "$(stat -c %y "$file")" +%d
[[ ! -d "$other/$year/$month/$day" ]] && mkdir -p "$other/$year/$month/$day";
mv "$file" "$other/$year/$month/$day`
したがって、既定では、別のサブディレクトリでファイルを検索し、ファイルが最後に変更された年、月、日に基づいてフォルダを作成しながら、ファイルを別のフォルダに移動します。
私の質問は、同じ名前のファイルを移動するときに自動的にファイル名をfile(1).txtに変更するようにこれを追加する方法です。これで、コードは両方の代わりにファイルの1つだけをコピーします。
ありがとうございます。
答え1
そして
mv --backup=t file directory/
file、file.~1~、file.~2~ などの名前のファイルをインポートする必要があります。
答え2
あなたの質問のコードがまったく機能しない場合でも、「数字のサフィックスを追加してファイルを失うことなく移動する方法」という質問を解決するには、次のようなコードが機能します。
$ cat mvr.sh
#!/usr/bin/env bash
bail() {
retcode=$1
shift
printf "%s" "$*" 1>&2
exit "$retcode"
}
[[ -f "$1" ]] || bail 1 "File '$1' not found"
if ! [[ -f "$2" ]]; then
mv "$1" "$2"
else
if [[ -d "$2" ]]; then
$0 "$1" "${2}/${1}"
exit $?
else
suffix=1
until ! [[ -f "${2}.$suffix" ]]; do
suffix=$((suffix+1))
done
mv "$1" "${2}.$suffix"
fi
fi
実行中:
$ ls
bar bar.1 bar.2 mvr.sh
$ touch foo; ls
bar bar.1 bar.2 foo mvr.sh
$ ./mvr.sh foo bar
$ ls
bar bar.1 bar.2 bar.3 mvr.sh
これを行う方法の実際の鍵はステートメントからif
始まります。
- ターゲットファイル名がまだ存在しない場合は問題ありません
mv
。 。 - それが存在し、ディレクトリであれば良いです。そのディレクトリに再帰的に書き込みます。
- 存在し、ファイルの場合は、まだ存在しないものが見つかるまで新しい数字のサフィックスを試してください。