Bash

重命名任何深層子文件夾(如父文件夾)中的文件,然後移至中央文件夾

  • May 14, 2022

我有一個問題,我需要在父文件夾之後重命名某些文件,然後將它們移動到中央文件夾。有沒有辦法做到這一點?我想在 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" ]]檢查是否$pathnamef文件
  • ${pathname%%/*}:使用shell-parameter-expansion,從參數中刪除最長的後綴pathname。削減一切直到第一個斜線/字元。
  • ${pathname##*.}": 相同,但這會從pathname參數中刪除最長的前綴;將所有內容剪切到最後一個點.字元。
  • [[ -d "$pathname" ]]檢查是否$pathnamedirectory
  • ... && -z "$(ls -A -- "$pathname")"然後檢查pathname 作為目錄的 basename 是否為空

echo當您對結果滿意時刪除。

引用自:https://unix.stackexchange.com/questions/622395