ファイル名を変更し、親ディレクトリ名をファイルに追加しようとします(そして「Photos」という名前の新しいフォルダに移動します)。
私はこれをしようとしてきました。名前を変更するそしてミリメートル波ただし、次の例では、ディレクトリAにあるときにこれを行うのに問題があります。
$ pwd
/A
$ tree
.
├── 1.jpg
├── 2.jpg
└── 3.jpg
ただし、フォルダ階層の1つ以上のレベルで名前変更を実行すると正常に動作します。
$ pwd
/
$ tree
.
└── A
├── 1.jpg
├── 2.jpg
└── 3.jpg
$ rename 's|(.*)/(.*)|$1/Photos/$1 - $2|' */*.jpg -p
$ tree
.
└── A
└── Photos
├── A\ -\ 1.jpg
├── A\ -\ 2.jpg
└── A\ -\ 3.jpg
例では、「A」ディレクトリにあるときにこれをどのように達成できますか?
答え1
rename
まあ、これは私が持っているよりもエキゾチックなので、まずsedを試してみてください。
Dir=$(basename "$PWD")
mkdir -p Photos
ls *.jpg|sed 's|\(.*\)|mv "\1" "Photos/'"$Dir"' - \1"|' |sh
私はこれが次のように名前を変更すると解釈されると思います。
Dir=$(basename "$PWD")
rename 's|(.*)|Photos/'"$Dir"' - $1|' *.jpg -p
答え2
拡張アンドレ・ボードの回答。私もrename
このコマンドでいくつかの追加実験を行いました。 4つのバリエーションはすべて機能し、おそらくよりきれいにすることができます。私はAndreBeaudが一重eval
引用符を使用せず、代わりに一重引用符を使用して文字列を連結したことに気づきました。便利。
短いですが、読むのは少し難しいです。
rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' `pwd`/*.jpg --make-dirs
置換セクションのフォルダ名は読みやすくなります。
eval "rename 's|(.*)|Photos/$(basename `"pwd"`) - \$1|' *.jpg --make-dirs"
まず変数を作成します。この場合、一度だけ使用されるので問題ではありません。従うのは簡単です。
Dir=$(basename `"pwd"`); eval "rename 's|(.*)|Photos/$Dir - \$1|' *.jpg --make-dirs"
変数が最初に出てくるのに検索部分にフォルダ名があってすごく汚れます。
Dir=$(basename `"pwd"`); rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' ../$Dir/*.jpg --make-dirs
AndreBeaudと私のバージョンを組み合わせると、次のような短いバージョンになります。
rename 's|(.*)|Photos/'"$(basename "$PWD")"' - $1|' *.jpg --make-dirs