0

ファイル名またはテキストの内容に会社名が含まれている大量のファイル (200 以上を数えます) の名前を変更しようとしています。基本的に、「会社」への言及を「新会社」に変更し、必要に応じて大文字を維持する必要があります (つまり、「会社は新会社になる」、「会社」は「新会社」になります)。これを再帰的に行う必要があります。

この名前はどこにでもある可能性があるため、私の要件を満たすコード例を見つけることができませんでした。これらの例のいずれか、またはそれ以上の可能性があります。

company.jpg
company.php
company.Class.php
company.Company.php
companysomething.jpg

うまくいけば、あなたはアイデアを得る。これは、ファイル名だけでなく、HTML や PHP スクリプトなどのテキスト ファイルの内容に対しても行う必要があります。これは 2 番目のコマンドであると推測していますが、完全にはわかりません。

コードベースを検索したところ、約 300 のファイルで 2000 近くの会社名の言及が見つかったので、手動で行うのは好きではありません。

助けてください!:)

4

4 に答える 4

1

man renameファイルの名前を変更するための非常に強力な perl ユーティリティを参照することをお勧めします。

標準構文は

rename 's/\.htm$/\.html/' *.htm

巧妙な部分は、ツールが変更されるファイル名のパターンとして任意の perl-regexp を受け入れることです。

-nツールが変更された内容のみを報告するようにするスイッチを付けて実行することをお勧めします。

大文字を維持する良い方法は今のところわかりませんが、既にファイル構造を検索できるので、renameすべてのファイルが変更されるまで、大文字と小文字を変えていくつか発行してください。

現在のフォルダーの下にあるすべてのファイルをループして特定の文字列を検索するには、次を使用できます

find . -type f -exec grep -n -i STRING_TO_SEARCH_FOR /dev/null {} \;

そのコマンドからの出力は、ファイルに送信できます (変更が必要なファイルのファイル名を抽出するためのフィルタリングの後)。

find . /type ... > files_to_operate_on

次に、それをループでラップし、インwhile readプレース置換のためにいくつかの perl-magic を実行します

while read file
do
    perl -pi -e 's/stringtoreplace/replacementstring/g' $file
done < files_to_operate_on
于 2012-06-29T11:04:43.043 に答える
1

bash強力なループ機能と置換機能があります。

for filename in `find /root/of/where/files/are -name *company*`; do
    mv $filename ${filename/company/newcompany}
done
for filename in `find /root/of/where/files/are -name *Company*`; do
    mv $filename ${filename/Company/Newcompany}
done
于 2012-06-29T10:58:02.770 に答える
1

ファイル名とディレクトリ名には、、、およびをfor使用しfindます。mvsed

名前に含まれるパス ( f)ごとcompanyに、名前を ( mv) からf新しい名前に変更します。ここで、companyは に置き換えられnewcompanyます。

for f in `find -name '*company*'` ; do mv "$f" "`echo $f | sed s/company/nemcompany/`" ; done

ファイルの内容についてはfindxargsとを使用しますsed

すべてのファイルについてcompanynewcompany拡張子.backup.

find -type f -print0 | xargs -0 sed -i .bakup 's/company/newcompany/g'
于 2012-06-29T11:15:00.147 に答える
0

ファイルを再帰的に処理する正しい方法はほとんどありません。ここに1つあります:

while IFS= read -d $'\0' -r file ; do
    newfile="${file//Company/Newcompany}"
    newfile="${newfile//company/newcompany}"
    mv -f "$file" "$newfile"
done < <(find /basedir/ -iname '*company*' -print0)

これは、空白が含まれていないものだけでなく、考えられるすべてのファイル名で機能します。

bash を想定しています。

ファイルの内容を変更する場合は注意が必要です。ファイルがプレーン テキストでない場合、ファイル内でブラインド置換を行うと問題が発生する可能性があるためです。とは言っても、sedこういうことのために作られたのです。

while IFS= read -d $'\0' -r file ; do
    sed -i '' -e 's/Company/Newcompany/g;s/company/newcompany/g'"$file"
done < <(find /basedir/ -iname '*company*' -print0)

この実行では、いくつかのスイッチを追加してfind、処理するファイルを制限することをお勧めします。

find /basedir/ \( -iname '*company*' -and \( -iname '*.txt' -or -ianem '*.html' \) \) -print0
于 2012-06-29T13:54:36.187 に答える