簡體   English   中英

遞歸查找目錄並在Shell腳本中重命名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM