移動時に同じ名前でファイル名を変更する

移動時に同じ名前でファイル名を変更する

これは私の現在のコードです。

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。 。
  • それが存在し、ディレクトリであれば良いです。そのディレクトリに再帰的に書き込みます。
  • 存在し、ファイルの場合は、まだ存在しないものが見つかるまで新しい数字のサフィックスを試してください。

関連情報