Shell

如何在 shell 中僅提取父目錄的“基本名稱”?

  • August 30, 2016

我需要使用 shell 腳本通過某個“鍵”重命名幾個文件。此密鑰包括字元串以及我使用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/

我需要將**../index/文件夾重命名為../c2_$$ parentFolderName $$/**。這就是我正在嘗試的:

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/..")""' {} \;

這只是一種變體,它也不起作用(沒有理由應該這樣做:))。

我對 shell 腳本很陌生,並且正在嘗試以一種與shell 無關的方式盡可能多地學習,所以請忽略我目前正在使用 ZSH。

最好是使用zsh’s 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作為一個窮人的 ersatz 來進行理智檢查zmv)。

如果你想使用find便攜(POSIXly),你需要忘記-mindepth/ -maxdepth,你可以用-pathand的組合替換它-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 {} +

與其他兩種方法的一個區別是它不會遵循符號連結,並且它還會index在隱藏目錄中查找。

那些使用了標準${var#pattern}的參數擴展運算符,在此處或在POSIX shell 規範${var%pattern}中描述的無數問答中。

引用自:https://unix.stackexchange.com/questions/306602