
これができるようにしたい: 名前を変更し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
てグループ化し、 に一致し、任意の数の文字に一致してグループ化します。一致部分を、最初にキャプチャされたグループの後に/
文字が続き、string3
2 番目にキャプチャされたグループの後に が続き、string2
3 番目にキャプチャされたグループの順に置き換えます (はドライ ランを実行します。実際にファイル名を変更するには、これを削除します)-n
。rename
% 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)