
コレクションの写真を「/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 にコピーします。