新しい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