0

Linuxコマンドやbashスクリプトについて何も知らないので、助けてください。さまざまなディレクトリにたくさんのファイルがあり、bash ファイルを使用してこれらすべてのファイルの名前を「name」から「name.xml」に変更したいのですが、それは可能ですか? 次のような有用なコードをインターネットで見つけました。

shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
echo "$i" "${i/%.txt}.xml";
done

それも機能しません。

4

4 に答える 4

1

prenameこの目的のために、多くの Linux ディストリビューションにデフォルトでインストールされているユーティリティが便利です。通常、Perl パッケージで配布されています。次のように使用できます。

find . -iname '*.txt' -exec prename 's/.txt/.xml/' {} \;

または、このはるかに高速な代替手段:

find . -iname '*.txt' | xargs prename 's/.txt/.xml/'
于 2013-04-05T10:08:52.400 に答える
0

表示は、指定されたパターンに一致するファイル*/.txt */.xmlが事実上存在しない*ことを意味します。これは、一致が見つからない場合、デフォルトで bash が verbatim を使用するためです。

この問題を防ぐshopt -s nullglobには、一致するものがまったくない場合に bash が何も返さないように追加設定する必要があります。

エコーされた行がある程度妥当に見えることを確認した後、置き換える必要があります

echo "$i" "${i/%.txt}.xml"

mv "$i" "${i/%.txt}.xml"

ファイルの名前を変更します。

于 2013-04-05T10:12:37.863 に答える
0

説明

拡張子が何であれ、現在のディレクトリ以下のすべてのファイルを からnameに移動/名前変更しますname.xmlecho実際のスクリプトを実行する前に、使用してテストする必要があります。

shopt -s globstar # enable ** globstar/recursivity
for i in **; do # **/*.txt will look only for .txt files
    [[ -d "$i" ]] && continue # skip directories
    echo "$i" "$i.xml"; # replace 'echo' by 'mv' when validated
    #echo "$i" "${i/%.txt}.xml"; # replace .txt by .xml
done
于 2013-04-05T10:21:35.517 に答える