シェルスクリプトを使用して、特定の「キー」に複数のファイルの名前を変更する必要があります。キーは、文字列と.txtファイルを使用して取得したファイルパスの抽出部分で構成されていますfind
。
私はMac、OSX El Capitanを使用しており、ZSHを使用しています。ここにいるディレクトリツリー:
├── 300x250
│ ├── 300x250-img-fallback.jpg
│ └── index/
├── 300x600
│ ├── 300x600-img-fallback.jpg
│ └── index/
├── 336x280
│ ├── 336x280-img-fallback.jpg
│ └── index/
└── 970x250
├── 970x250-img-fallback.jpg
└── index/
名前を変更する必要があります。../インデックス/フォルダ../c2_[親フォルダ名]/。これが私が試していることです:
find . -type d -mindepth 2 -maxdepth 2 -exec sh -c 'echo -- mv "$0" "$(dirname "$0")"/"C2_"$(basename "$0/..")""' {} \;
basename
残念ながら、これは親を救う正しい方法ではないようです。
find . -name "*index" -exec sh -c 'echo -- mv "$0" "$(dirname "$0")"/"C2_"$(basename "$0/..")""' {} \;
これは単なるバリエーションであり、機能しません(動作する理由はありません:))。
私は初めてシェルスクリプトに触れて、できるだけ学びたいと思います。シェルとは何の関係もない片道なので、現在ZSHを使用していることを無視してください。
ベストアンサー1
zsh
使用するのが最善ですzmv
:
autoload zmv # best in ~/.zshrc
zmv -n '(*)/index' '$1/C2_$1'
(幸せなら削除-n
)。
ポータブル(POSIXsh
)解決策:
for dir in */index; do
mv -i -- "$dir" "${dir%/*}/C2_${dir%/*}"
done
(-i
貧しい人の精神状態チェックに代わってzmv
)。
使いたいならfind
-mindepth
移植可能(POSIXly)では、/を忘れなければならず、次の組み合わせ-maxdepth
で置き換えることができます。-path
-prune
LC_ALL=C find . -path './*/*' -prune -name index -exec sh -c '
for dir do
top=${dir#./}
top=${top%/*}
mv -i -- "$dir" "$top/C2_$top"
done' sh {} +
他の2つの方法との違いの1つは、シンボリックリンクに従わずに隠されたindex
ディレクトリも検索することです。
ここまたはサイトの多数のQ&Aで説明されている標準パラメータ拡張演算子を使用してください${var#pattern}
。${var%pattern}
POSIXシェル仕様。