2
for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-`
do
          cd $i
          ls
          cd ../
 done

上記の例では、スクリプトが各ディレクトリに入り、そのディレクトリのすべてのファイルにデータを入力し、そこから出て、他のディレクトリに入り、その内容を出力することを期待しています。ここで間違っていることを提案してください。

4

5 に答える 5

2

フィールド 13 が、ls コマンドの出力の最後のフィールドである目的のフィールドであるかどうかを確認してください。私のシステムでは、それは 9 番目のフィールドです。だから私はあなたのコードを次のように変更しました

for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
do
      echo  "Directory -$i"
      cd $i
      ls
      cd ../

done

この変更後、正常に動作します。

また、sed、awk などの他のコマンドを使用して実行することもできます。私はawkを使用してそれを行いましたが、フィールド値をハードコーディングしませんでした(ディレクトリの名前であるはずの最後のフィールドを取得するために、内部変数NF - フィールド数を使用しました)。

#for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
for i in `ls -lrt|grep ^d|awk '{print $NF}'`

do
      echo  "Directory -$i"
      cd $i
      ls
      cd ../

done

これもうまくいきました。

于 2012-10-28T07:14:44.903 に答える
2

ls フォーマットと可変長テキスト フィールドの気まぐれにより、ls -ltr 出力の各フィールド間に可変数のスペースがあるため、cut コマンドは正しく機能しません。ls ディレクトリ リストからファイル名を解析するより信頼性の高い方法は、cut コマンドを awk '{print $9}' に置き換えることです。したがって、for ループは次のようになります。

for i in `ls -lrt|grep ^d| awk '{print $9}'`
于 2012-10-28T07:03:03.863 に答える
1

次のいずれかを実行して、探していることを実行しますか?

ls *
ls * -r
于 2012-10-28T06:43:58.967 に答える
1

現在のディレクトリ内のディレクトリのみを反復処理するには、 pattern を使用します*/

for dir in */; do
    cd "$dir"
    do stuff
    cd ..
done
于 2012-10-28T13:20:14.717 に答える
0

ls名前にスペースが含まれるファイルでは失敗するため、「 for file in 」のバリエーションを実行しないでください。あなたに必要なのは:

find . -print

現在のディレクトリ内の各ファイルで何かをしたい場合は、

for file in *
do
    printf "Working on %s\n" "$file"
    <do stuff with "$file">
done

または、すべてのサブディレクトリについても xargs を使用するか、次のようにします。

find . -print |
while IFS= read -r file
do
    printf "Working on %s\n" "$file"
    <do stuff with "$file">
done

ただし、後者は、パイプベースのソリューションと同様に、名前に改行が含まれるファイルでは失敗します。

于 2012-10-28T07:31:10.957 に答える