0

2つのサブディレクトリを持つディレクトリがあり、サブディレクトリがほとんどなく、いくつかのファイルがあります。ファイル名に html 拡張子を追加するには、すべてのファイルの名前を変更する必要があります。ディレクトリ構造は次のようになります

main-directory
   sub-directory
   sub-directory
       sub-directory
          file1
          file2
          and so on to lot of files

今、私はこのようなものを使用できませんでした

for file in main-directory/*
do
if [ -f "$file" ]
then `mv "$file" "$file.html"`
fi
done

for ループはパスを再帰的に使用しないためです。だから私はこのようなものを使いました

for file in `ls -1R main-directory`  // -1 for showing file and directory names separated by new lines and -R for recursive travel
do
if [ -f "$file" ]
then `mv "$file" "$file.html"`
fi
done

上記のコードはファイルの名前を変更できません。行かどうかを確認する

for file in `ls -1R main-directory`  

私はこのようなものを書きました

for file in `ls -1R main-directory`
do
if [ -f "$file" ]
echo $file
done

これは何も表示されません。何が間違っている可能性がありますか?

4

4 に答える 4

3

ファイルの種類を検索して調べ、次に -exec を使用してすべてのファイルを変更し、.html を追加することができます。

find main-directory -type f -exec mv -v '{}' '{}'.html \; 
于 2011-06-09T02:57:40.570 に答える
1

最初のforループでは、mvコマンドをバックティックにしないでください。

2番目forのループでは、ifステートメントの構文が正しくありません。thenまたははありませんfi。そのはず:

for file in `ls -1R main-directory`
do
if [ -f "$file" ]
then
   echo $file
fi
done

ls -1R main-directoryしかし、それでも、ファイルへの絶対パスではなく、ファイル名だけが表示されるため、これは機能しません。エコーをifステートメントの外に移動してテストします。

for file in `ls -1R main-directory`
do
   echo $file
done

そのためls -1R main-directory、現在のディレクトリ内のすべてのファイルを取得するための良い方法ではありません。find . -type f代わりに使用してください。

于 2011-06-09T07:34:41.587 に答える
0

何らかの理由で、とを使用find ... -execして頭のてっぺんから構文を 思い出せません。代わりに、findから供給されるループを使用する習慣に陥りました。{}\;

find main-directory -type f | while read file
do
    mv "$file" "$file.html"
done

find各ファイルをstdoutに出力し、read fileは一度に1行を消費し、その行の内容を$file環境変数に設定します。その後、ループの本体のどこでもそれを使用できます。

私はこのアプローチを使用して、大量の出力をループして何か便利なことをする必要があるこのような多くの小さな問題を解決します。それはより用途が広いので、私はそれを難解なfind ... -exec {} \;アプローチよりも多く使用します。

もう1つのトリックはecho、システムに損傷を与える可能性のあることを行う前に、迅速な健全性チェックを実行するコマンドを前に付けることです。

find find main-directory -type f | while read file
do
    echo mv "$file" "$file.html"
done
于 2011-06-09T14:36:16.243 に答える
0

これが私の質問に対する答えです。人々はきちんとしたアプローチである1つのライナーで反応しましたが、私はそれらの1つのライナーからあまり得られなかったので、ここに私が欲しかったものがあります

IFS=$'\n'   // this is for setting field separator to new line because the default is whitespace
dir=main-directory
for file in `ls -1R main-directory | sed 's/:$//'`  // -1 for showing file and directory names separated by new lines and -R for recursive travel
do
if [ -f "$dir/$file" ]
then `mv "$dir/$file" "$dir/$file.html"`
elif [ -d "$file" ]
then dir=$file
fi
done

ここでは、行末のsed 's/:$//'a を検出して削除します。これは、ディレクトリが検出されるたびに最後に追加さ:れるため、コードの実行を妨げていたものの1つでしたls -1R main-directory:

于 2011-06-09T18:56:39.763 に答える