一連のファイルの名前を変更しようとしています。
現在のディレクトリにあるfooのインスタンスの名前をbarで次のように変更できます。
ls . | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh
再帰的にするために何を追加できますか?
編集/私の解決策
私はこのシェルタイプのものを知らない/理解していないので、いくつかの(かなり汚い)Rubyでそれをしました:
5.times do
Dir["**/*"].each do |f|
file_name = File.absolute_path f
should_rename = file_name.include? "yolo"
new_file_name = file_name.gsub("yolo", "#{@project_name}")
File.rename(f, new_file_name) if (should_rename and File.exists? f)
end
end
rename
ユーティリティは、正規表現の知識を必要としない構文も提供します。ユーティリティをインストールしたら
brew install rename
オプション -s
はfoo
の最初のインスタンスをbar
に置き換えます。
find . -exec rename -s 'foo' 'bar' {} +
そしてオプション-S
はすべてのインスタンスを置き換えます:
find . -exec rename -S '_' ' ' {} +
これは、上記で提供された Marcel Steinbach と実際には同じソリューションですが、構文が異なります。
「あるファイル構造でXを再帰的に実行するにはどうすればよいですか」に対する答えは、ほとんどの場合、find
を使用することです。この場合、おそらくfor
ループと組み合わせて使用することもできます。次の例では、現在のディレクトリのパターンfoo
に一致するファイルを再帰的にループします。
thedir=./
for file in $(find $dir -type f -name foo); do
# rename $file here
done
希望する名前変更スキームと名前変更の表現方法に応じて、ループの本体には異なる名前変更コマンドがあります。
foo
という名前のすべてのファイルの名前をbar
に変更するだけで、1つのファイルbar
になりますが、これは通常、人々が望んでいることではありません。 $file
変数にはファイルへの相対パスが含まれているため、異なるbar
のパスは異なります。