シェルから親ディレクトリの「basename」のみを抽出するにはどうすればよいですか?

シェルから親ディレクトリの「basename」のみを抽出するにはどうすればよいですか?

シェルスクリプトを使用して、特定の「キー」に複数のファイルの名前を変更する必要があります。キーは、文字列と.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シェル仕様

おすすめ記事