親フォルダなどのサブフォルダのファイル名を変更し、中央フォルダに移動します。

親フォルダなどのサブフォルダのファイル名を変更し、中央フォルダに移動します。

親フォルダの後に特定のファイルの名前を変更し、中央フォルダに移動する必要がある問題があります。これを行う方法はありますか? 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

拡張子がすべて異なるため、ファイルの上書きに問題はありません。

ベストアンサー1

#! /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%%/*}:使用シェルパラメータ拡張、パラメータから最長のサフィックスを削除しますpathname。最初のスラッシュ文字の前の内容をすべて切り取ります/
  • ${pathname##*.}":同じですが、引数から最長の接頭辞を削除し、pathname最後のドット文字まですべてを切り捨てます.
  • [[ -d "$pathname" ]]ディレクトリ$pathnameであることを確認してください。d
  • ... && -z "$(ls -A -- "$pathname")"次に、デフォルト名が次のようになっていることを確認します。pathname これはディレクトリです。空ですか?

echo結果が満足であれば削除してください。

おすすめ記事