![](/img/trans.png)
[英]Shell script to recursively rename filenames with special characters escaped?
[英]Recursively find a directory and rename it in Shell Script
我將一個簡單的Shell腳本放到可以在Linux機器上運行的地方:
1)在主目錄中查找特定的子目錄。 這些子目錄具有非常特定的命名約定(請參見下文),並且它們始終位於主目錄下2 -max深度。
2)將這些子目錄重命名為其原始名稱的PART。
例如,子目錄被命名為:
andrew-11111
andrew-11112
andrew-11113
andrew-11114
到達這些子目錄的路徑如下所示:
myphotos/sailing/photos/andrew-1111
myphotos/sailing/photos/andrew-1112
myphotos/biking/photos/andrew-1113
myphotos/hiking/photos/andrew-1114
我想從以下各個子目錄中取出“ andrew-”:
myphotos/sailing/photos/1111
myphotos/sailing/photos/1112
myphotos/biking/photos/1113
myphotos/hiking/photos/1114
Ive可以“查找”子目錄並列出它們。 我也了解如何在命令行中復制和重命名。 但是,將其整合到我的shell腳本知識水平上已經花費了我無法承受的更多時間。 只是免責聲明,我非常願意學習,並且編寫了一些shell腳本,但是對於這仍然是新手。 任何幫助或示例,不勝感激!
使用通配符來匹配嵌套目錄中的文件
您可以使用bash 參數擴展運算符來操縱文件名。
for file in myphotos/*/photos/*; do
name=${file##*/} # remove everything up to last /
dir=${file%/*} # remove everything from last /
newname=${name##*-} # remove everything up to last -
mv "$file" "$dir/$newname"
done
如果您有基於perl的rename
命令,則可以執行以下操作:
rename 's#[^/]*-##' myphotos/*/photos/*
您可以使用以下這種方法:
find -type d -name andrew\* -exec sh -c 'mv {} $(dirname {})/$(basename {} | cut -d"-" -f2)' \;
說明:
-type d
僅查找目錄 -name andrew\\*
自明,盡管您必須逃脫*
-exec sh -c '...'
在子shell中執行它,因此您可以執行命令替換( $(...)
)而不會出現問題 mv {}
的{}
持有任何find
的發現 dirname
為您提供目錄的路徑(嘗試使用隨機路徑,我的英語太糟糕了,無法更好地解釋) basename
為您提供給定路徑的最后一個目錄 cut -d"-" -f2
使用cut剪切掉“ andrew-”。 為此,將定界符設置為-
並選擇字段號2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.