すべてのファイルディレクトリを繰り返し、長さが5より大きいファイルをインポートします。

すべてのファイルディレクトリを繰り返し、長さが5より大きいファイルをインポートします。

新しいLinuxユーザーはここを見てください。すべてのディレクトリフォルダを通過して名前をエコーし​​、名前の全長を抽出した後、エコをトイレタワーに保存してコントロールにエコーするループを作成しています。

合計の長さが5未満の場合は印刷され、それ以外の場合は通過するように別の条件を追加するにはどうすればよいですか?

私は以下を試しました:

for i in *                 
    do
        if [ -d "$i" ]
            then
           if (echo n "$i" | wc -m < 5)
                then
                    wc
               fi
        fi
    done

以下を印刷してください。

zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
...
...

特定の条件下でサブディレクトリファイルにアクセスできるように、親ディレクトリ内のファイルをどのようにインポートできますか?

for i in *
    do
        if [ -d "$i" ]
             if (( $( echo n "$i" | wc -m ) == 76 ))
             then
             find $i
        fi 
    done

親ディレクトリのファイルの印刷

答え1

すべてのディレクトリで名前が5文字を超えないディレクトリを検索するには、コマンドを使用して実行できますfind。明示的なループは必要ありません。

find -type d \( -name '??????*' -o -print \)

説明する

  • -type d- ディレクトリエントリのみが考慮されます。
  • \( ... \)- これらを一つにまとめる
  • item1 -o item2-item失敗した場合item2
  • -name '??????*'- 6文字以上の名前と一致します。
  • -print- 現在のプロジェクト名を印刷します。

要約すると、まずディレクトリのみを一致させます。次の部分は6文字以上のエントリ(ディレクトリ)と一致し、一致が失敗した場合はエントリ(ディレクトリ)の名前を印刷します。

答え2

この試み:

for i in *
  do
    if [ ${#i} -gt 5 ]; then
        echo $i: ${#i};
    fi;
  done

答え3

注:タイトルには「長さが次より大きい」と記載されていますが、コード例ではより小さい記号を使用しています<。私はここで後者を仮定しています。前者が必要な場合は、次のよう-ltに変更してください。-gt

zshを使用しているので、次のようにして直接これを行うことができます。グローバル予選、明示的なループはまったく必要ありません。

  • 修飾子は/結果をディレクトリのみに制限します。

  • (nullglob)修飾子は、一致Nするファイルが存在しない場合にエラーを抑制するために使用されます。

  • (オプション)D隠しディレクトリを含めるには、修飾子を追加します。

  • e:cmd:cmd修飾子がtrueを返すファイルのみを返す

cmd変数を通して一致する各ファイル名に適用されるシェル式はどこにありますかREPLY?あなたの場合、拡張テスト式を使用して[[ $#REPLY -lt 5 ]]外部コマンドなしで結果の長さをテストできます。だから#wc

print -rC1 *(/Ne:'[ $#REPLY -lt 5 ]':)

サブディレクトリを介して再帰的に作成するには、**/*「globstar」モードを使用し、REPLY長さ比較を実行する前に変数から先行パスコンポーネントを削除します。

print -rC1 **/*(/Ne:'[ ${#REPLY##*/} -lt 5 ]':)

man zshexpn詳細より。

答え4

@tinkは私が解決策を見つけるのを助けるために正しいコードを提供する素晴らしい仕事をしました。

このスクリプトの仕組み:

for i in *
    do
        if [ -d "$i" ]
             if (( $( echo n "$i" | wc -m ) > 75 ))
             then
             echo "$i" 
        fi 
    done

関連情報