1年以上経過したファイルを親アーカイブディレクトリに移動する

1年以上経過したファイルを親アーカイブディレクトリに移動する

コレクションの写真を「/home/Bruno/Bilder」ディレクトリの親である「/home/Bruno/Archiv/Bilder」ディレクトリに移動したいと考えています。

私は次のように始めました:

find  -ctime +365 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | bash

しかし、find は {} 内に現在のディレクトリのドットを含めます。つまり、次のようになります。

mv ./2013/01/19/DSC_0141.JPG ../Archiv/Bilder/./2013/01/19/DSC_0141.JPG
mv: das Verschieben von »./2013/01/23/IMG_0052.JPG“ nach »../Archiv/Bilder/./2013/01/23/IMG_0052.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

そこで、sed の使用からドットを削除しました。

find  -ctime +577 -exec echo mv '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

しかし、同じエラーが発生します:

mv: das Verschieben von »./2013/01/10/IMG_0141.JPG“ nach »../Archiv/Bilder/2013/01/10/IMG_0141.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

そこで、rsync に切り替えて作業を実行したいと考えました。

find  -ctime +577 -exec echo rsync -n --remove-source-files '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

rsync は失敗しますが、それについてはさらに詳細に記述されています。

rsync: change_dir#3 "/home/Bruno/Bilder//../Archiv/Bilder/2013/01/10" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(712) [Receiver=3.1.0]

ここで何が間違っているのでしょうか?

答え1

find コマンドを実行すると、中間ディレクトリ (この場合は ) がまだ作成されていないという問題が発生します。これは、パス内の/home/Bruno/Archiv/Bilder/2013/01/23/(無害な) ' ' とは何の関係もありません。.

最初にターゲットへのディレクトリ構造全体を作成するか、代わりに呼び出す小さなスクリプトを作成して、mv最初にターゲット ディレクトリを作成し、次に移動を実行する必要があります。

mkdirmv:

#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"

答え2

今後の参考のために、これを直接実行するために使用できますinstall:

install -D ./2013/01/10/IMG_0141.JPG ../Archiv/Bilder/2013/01/10/IMG_0141.JPG

注意: これを機能させるには、2 番目の引数にファイル パスを追加する必要があります。言い換えると、次のようになります。

正しくない:

find . -ctime +365 -exec install -D '{}' ../Archiv/Bilder/ \;

正しい:

find . -ctime +365 -exec install -D '{}' '../Archiv/Bilder/{}' \;

のマニュアルページによるとinstall:

-D 最後のものを除く DEST の先頭コンポーネントをすべて作成し、SOURCE を DEST にコピーします。

関連情報