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

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

まず、ターゲットの完全なディレクトリ構造を作成するか、まずターゲット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にコピーします。

関連情報