名前が4文字しかないファイルを検索したい。
例、/tmp
の下に3つのファイルがあります:
$ ls /tmp
txt
file
linux
4文字しかないため、出力にはfile
のみが表示されます。
使用 ?
ファイルグロビングのワイルドカード:
ls -d /tmp/????
これにより、ファイル名が4文字のすべてのファイルとディレクトリが印刷されます。
@roaimaによって提案されたように、-d
フラグは、パターンに一致するサブディレクトリのコンテンツをls
に表示しないようにします。
/tmp
のみのファイルをリスト:
cd /tmp
find . ! -name . -Prune -path './????' -type f
/tmp
内のファイルを再帰的に一覧表示します:
find /tmp -path '*/????' -type f
試してください:
find /tmp -type f -print| awk -F/ ' length($NF) == 4 '
awk
の機能:
/
を使用し、$NF
(最後のフィールド)を検索していますlength
Perl
(5.10以降)ソリューションもあります。
Perl -E 'say for </tmp/????>;'
希望する長さを指定できるやや柔軟なバージョン:
Perl -E 'my $w = "?" x shift; say for </tmp/$w>;' 4
これは、4バイトのファイルを見つける最も簡単な方法のようです。
find /tmp -type f -size 4c
編集:4バイトのファイルnameを検索するには:
find /tmp -type f -name '????'
Bashを使用している場合、次のことができます。
shopt -s globstar
shopt -s nullglob
filearray=(/tmp/**/????)
これにより、必要なファイルのリストが配列filearray
に配置されます。ファイル名の改行(およびその他のエキゾチックな文字)は正しく処理されます。
Globstarを設定すると**
グロブパターンでサブディレクトリ間で照合し、必要な再帰検索を行います。
Nullglobを設定すると、一致するものがなければ、展開は何も展開しません。そうでなければ、それはそれ自体に拡大しますが、おそらくあなたが望むものではありません。
"/ tmp /"は5文字です。そのため、テストには「9」(5 + 4)があります。
for i in /tmp/* ;
do [ "${#i}" -eq 9 ] && printf %s\\n "$i";
done
または
for i in /tmp/* ;
do i="${i#/tmp/}"; # to get rid of /tmp/
[[ "${#i}" -eq 4 ]] && printf %s\\n "$i"; # there is 4 in test!
done
FWIW。改行(@cuonglm)で失敗せず、140文字の長いファイル名(@don_crissti)だけをリストするように簡単に変換できます。
シェルによってグロビングが行われるため、lsを呼び出したり、findを実行したりする必要さえありません。
$ echo /tmp/????
/tmp/file
$
唯一のことは、名前が4文字のファイルがない場合、印刷されるだけです。
/tmp/????
これをチェックし、行ごとに1つのファイルを出力する1行のbashスクリプトが必要になる場合があります。
pattern=/tmp/????? ; for f in $pattern ; do if [ $f != "$pattern" ] ; then echo $f ; fi ; done