親ディレクトリ名を使用してファイル名を変更するには?

親ディレクトリ名を使用してファイル名を変更するには?

recon.textファイル名をディレクトリ名に変更したいと思います。私は1000のディレクトリを持っています。助けてください?

7_S4_R1_001_tri10_sha/recon.text
8_S1_R1_001_tri15_sha/recon.text
9_S8_R1_001_tri20_sha/recon.text
10_S5_R1_001_tri25_sha/recon.text
11_S3_R1_001_tri30_sha/recon.text

答え1

そして:

rename -n 's!(.*sha)/recon\.text!$1/$1.txt!' */recon.text

-n実際に名前を変更するのに十分な出力がある場合は、スイッチを削除してください。

男の名前を変える

警告する これを行うこともできないかもしれない同じ名前の他のツールがあるので注意してください。

パッケージの一部である名前変更コマンドはutil-linuxそうではありません。

次のコマンドを実行すると(GNU

$ file "$(readlink -f "$(type -p rename)")"

Perl script, ASCII text executableを含めて含まない結果を得ると、ELFこれが正しいツールであるようです=)

そうでない場合は、それをデフォルト値に設定し(通常はすでに適用されている)、Debian次のように派生しますUbuntu

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename

RedHatシリーズディストリビューションの場合:

yum install prename

'prename'パッケージは次の場所にあります。エッフェルリポジトリ。


ArchiLinuxの場合:

pacman -S perl-rename

*BSDの場合:

pkg install gprename

またはp5-File-Rename


Macユーザーの場合:

brew install rename

他のディストリビューションにこのコマンドがない場合は、パッケージマネージャを検索してインストールするか、手動で行う(学科がありません...)


このツールはもともとPerlの父親であるLarry Wallによって書かれました。

答え2

標準ツールを使用すると、親ディレクトリでこれを行うことができます。

for file in */recon.text; do mv -- "$file" "${file%/*}/${file%/*}"; done

見つかったすべてのファイルの$file名前をに変更します${file%/*}/${file%/*}。これは${file%/*}「削除されたファイルパス」を意味します/[anything...]

たとえば、7_S4_R1_001_tri10_sha/recon.textファイルの場合

  • ${file%/*}次に展開7_S4_R1_001_tri10_sha
  • 以来${file%/*}/${file%/*}7_S4_R1_001_tri10_sha/7_S4_R1_001_tri10_sha
  • 次に実行される操作はですmv -- "7_S4_R1_001_tri10_sha/recon.text" "7_S4_R1_001_tri10_sha/7_S4_R1_001_tri10_sha"

doとの間にエコーを追加することで、実際mvにコマンドを実行する前にコマンドが実行するアクションを確認できます。

関連情報