web-dev-qa-db-ja.com

名前が4文字のファイルを検索する

名前が4文字しかないファイルを検索したい。

例、/tmpの下に3つのファイルがあります:

$ ls /tmp
txt
file
linux

4文字しかないため、出力にはfileのみが表示されます。

24
Mike

使用 ?ファイルグロビングのワイルドカード:

ls -d /tmp/????

これにより、ファイル名が4文字のすべてのファイルとディレクトリが印刷されます。

@roaimaによって提案されたように、-dフラグは、パターンに一致するサブディレクトリのコンテンツをlsに表示しないようにします。

51
dr_

/tmpのみのファイルをリスト:

cd /tmp
find . ! -name . -Prune -path './????' -type f

/tmp内のファイルを再帰的に一覧表示します:

find /tmp -path '*/????' -type f
11
cuonglm

試してください:

find /tmp -type f -print| awk -F/ ' length($NF)  == 4 '

awkの機能:

  • フィールド区切り文字として/を使用し、
  • ファイル名$NF(最後のフィールド)を検索しています
  • コンピューティングlength
  • そして、値が4であるかどうかを確認し、それを出力します。
9
Archemar

Perl(5.10以降)ソリューションもあります。

Perl -E 'say for </tmp/????>;'

希望する長さを指定できるやや柔軟なバージョン:

Perl -E 'my $w = "?" x shift; say for </tmp/$w>;' 4
4
Perleone

これは、4バイトのファイルを見つける最も簡単な方法のようです。

find /tmp -type f -size 4c

編集:4バイトのファイルnameを検索するには:

find /tmp -type f -name '????'
4
Ulric Eriksson

Bashを使用している場合、次のことができます。

shopt -s globstar
shopt -s nullglob
filearray=(/tmp/**/????)

これにより、必要なファイルのリストが配列filearrayに配置されます。ファイル名の改行(およびその他のエキゾチックな文字)は正しく処理されます。

Globstarを設定すると**グロブパターンでサブディレクトリ間で照合し、必要な再帰検索を行います。

Nullglobを設定すると、一致するものがなければ、展開は何も展開しません。そうでなければ、それはそれ自体に拡大しますが、おそらくあなたが望むものではありません。

2
Digital Trauma

"/ 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)だけをリストするように簡単に変換できます。

2
xpt

シェルによってグロビングが行われるため、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
0
philfr