Bash
重命名任何深層子文件夾(如父文件夾)中的文件,然後移至中央文件夾
我有一個問題,我需要在父文件夾之後重命名某些文件,然後將它們移動到中央文件夾。有沒有辦法做到這一點?我想在 Synology NAS 上執行它。
Root |-Subf1 | |-File.txt | |-File.doc | |-Subf1subf1 | | |-File.xml | | |-File.xls | |-Subf1subf2 | | |-File.pptx | | |-File.docx | |-Subf2 | |-File.txt | |-File.doc | |-Subf2subf1 | | |-File.xml | | |-File.xls
結果應該是:
Root |-Subf1 | |-Subf1.txt | |-Subf1.doc | |-Subf1.xml | |-Subf1.xls | |-Subf1.pptx | |-Subf1.docx | |-Subf2 | |-Subf2.txt | |-Subf2.doc | |-Subf2.xml | |-Subf2.xls
覆蓋文件沒有問題,因為它們都有不同的副檔名。
#! /bin/bash shopt -s globstar #enabled for '**' to match all files &directories recursively #shopt -s dotglob #uncomment to enable to match on hidden files/directories too cd /path/to/directory/Root for pathname in ./**/*; do [[ -f "$pathname" ]] && echo mv -v -- "$pathname" "${pathname%%/*}/${pathname%%/*}.${pathname##*.}"; done ##then remove remained empty directories for pathname in ./**/*; do [[ -d "$pathname" && -z "$(ls -A -- "$pathname")" ]] && rm -r -- "$pathname"; done
[[ -f "$pathname" ]]
檢查是否$pathname
是f
文件${pathname%%/*}
:使用shell-parameter-expansion,從參數中刪除最長的後綴pathname
。削減一切直到第一個斜線/
字元。${pathname##*.}"
: 相同,但這會從pathname
參數中刪除最長的前綴;將所有內容剪切到最後一個點.
字元。[[ -d "$pathname" ]]
檢查是否$pathname
是d
irectory... && -z "$(ls -A -- "$pathname")"
然後檢查pathname
作為目錄的 basename 是否為空。
echo
當您對結果滿意時刪除。