Shell
如何在 shell 中僅提取父目錄的“基本名稱”?
我需要使用 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
’szmv
:autoload zmv # best in ~/.zshrc zmv -n '(*)/index' '$1/C2_$1'
-n
(高興時刪除)。對於攜帶式(POSIX
sh
)解決方案:for dir in */index; do mv -i -- "$dir" "${dir%/*}/C2_${dir%/*}" done
(
-i
作為一個窮人的 ersatz 來進行理智檢查zmv
)。如果你想使用
find
便攜(POSIXly),你需要忘記-mindepth
/-maxdepth
,你可以用-path
and的組合替換它-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}
中描述的無數問答中。