サブディレクトリと現在のディレクトリ内のファイル名の一部を文字列に置き換えます

サブディレクトリと現在のディレクトリ内のファイル名の一部を文字列に置き換えます

これができるようにしたい: 名前を変更しstring1て先頭にstring3追加します。文字列 Fish が見つかり、Great_ = string2 の場合、Fish のようなものが Great_Bear に名前変更されます。string2

これまでのところ、私はこれを持っています:

    ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash

これは現在のディレクトリに対して機能します。

    ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash

これはサブディレクトリ内でのみ機能し、スクリプトが存在するディレクトリ内では機能しません。

string2また、ファイル名の先頭に追加する方法も知りたいです。

答え1

グロブスターパターンではなく、renameシンプルなマッチで使用します。*/*

rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn

ディレクトリと、それに含まれるものを一致させています。あまり遠くまで再帰したくないので、これは globstar よりもいくらか安全です。

最後-nに実際にそれを止めますやっている何も。ただ表示されるだけです。正しいと確信できたら削除してください。ただし、ここに小さなテストハーネスがあります:

$ mkdir -p test/test{1..3} && touch test/test{1..3}/file{1..3}
$ cd test
$ rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
test1/file1 renamed as test1/test1_file1
test1/file2 renamed as test1/test1_file2
test1/file3 renamed as test1/test1_file3
test2/file1 renamed as test2/test2_file1
test2/file2 renamed as test2/test2_file2
test2/file3 renamed as test2/test2_file3
test3/file1 renamed as test3/test3_file1
test3/file2 renamed as test3/test3_file2
test3/file3 renamed as test3/test3_file3

答え2

これでうまくいくはずです:

find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
  • find . -type f -exec{} +: 現在の作業ディレクトリの階層内でファイルを再帰的に検索し、結果のリストに展開してコマンド ラインの残りの部分を実行します。
  • rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +: は、 が最後に出現するまで、任意の数の文字に一致してグループ化し、/に一致し/、 が最後に出現するまでstring1、任意の数の文字に一致しstring1てグループ化し、 に一致し、任意の数の文字に一致してグループ化します。一致部分を、最初にキャプチャされたグループの後に/文字が続き、string32 番目にキャプチャされたグループの後に が続き、string23 番目にキャプチャされたグループの順に置き換えます (はドライ ランを実行します。実際にファイル名を変更するには、これを削除します) -nrename
% tree
.
└── dir
    ├── string1_bar.jpg
    ├── string1_foobar.jpg
    └── string1_foo.jpg

1 directory, 3 files
% find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
rename(./dir/string1_foo.jpg, ./dir/string3string2_foo.jpg)
rename(./dir/string1_foobar.jpg, ./dir/string3string2_foobar.jpg)
rename(./dir/string1_bar.jpg, ./dir/string3string2_bar.jpg)

関連情報