2016-11-17 173 views
0

對於許多文件,我想獲取父目錄並將其名稱附加到文件名。例如,在以下路徑:根據父目錄名稱重命名ZIP文件

A/B/C/file.zip 

我要重命名file.zipfile_C.zip

這是我的代碼。我必須找到其中不包含子目錄和zip文件的目錄,並且我想重命名它以引用父目錄。

find ${WORKDIR} -daystart -mtime +3 -type d -links 2 -exec bash -c 'zip -rm "${1%}".zip "$1"' _ {} \; 

回答

0

此工作的最佳工具是Perl自帶的rename實用工具。 (要注意的是util-linux還包含一個名爲rename工具。這不是你想要的。如果你有你的系統上,探討如何擺脫它,用自帶的Perl中替換它。)

隨着此實用工具,它是那樣簡單

find $WORKDIR -name '*.zip' -exec \ 
    rename 's:/([^/]+)/(.+?)\.zip$:/${2}_${1}.zip:' '{}' + 

您可以在第一個參數,這使得它更強大的比它看起來從這個例子堅持任意Perl代碼

請注意,您的find命令似乎做了一些不相關的事情,涉及到.zip文件的創建

1

這裏是一個純巴什解決方案:

find "$WORKDIR" -type f -name '*.zip' | while read file 
do 
    basename=$(basename "$file") 
    dirname=$(dirname "$file") 
    suffix=$(basename "$dirname") 
    if [[ "$basename" != *"_${suffix}.zip" ]]; then 
    mv -v "$file" "${dirname}/${basename%.zip}_${suffix}.zip" 
    fi 
done 

腳本處理的$WORKDIR發現循環中的所有*.zip文件。在循環中,它檢查$file是否已經有一個與父目錄名稱相同的後綴。如果它沒有這樣的後綴,那麼腳本會將該文件重命名爲"_{parent_directory_name}",並將其重命名爲擴展名之前的文件名。

樣品樹

A 
├── B 
│   ├── abc.zip.zip 
│   └── C 
│    └── file_C.zip 
└── one.zip 

樣本輸出

‘./t/A/one.zip’ -> ‘./t/A/one_A.zip’ 
‘./t/A/B/abc.zip.zip’ -> ‘./t/A/B/abc.zip_B.zip’ 

A 
├── B 
│   ├── abc.zip_B.zip 
│   └── C 
│    └── file_C.zip 
└── one_A.zip 

其中WORKDIR=./t

請注意,我故意簡化了find命令,因爲它對算法並不重要。您可以根據需要調整選項。