ディレクトリ内のファイルを繰り返す方法(隠しファイルを除く)

ディレクトリ内のファイルを繰り返す方法(隠しファイルを除く)

使用:

for eachfile in /mnt/thara/*

また、隠しファイルもナビゲートします。ファイルを隠す必要はありません。

答え1

bashの一般的な振る舞いは、forを使用するときに隠されたファイルを見ないことです。ただし、この動作はshoptコマンドを使用して変更できます。

「*」を使用して隠しファイルスキャンを有効にするには:

shopt -s dotglob

「*」を使用して隠しファイルチェックを無効にする(デフォルト動作)

shopt -u dotglob

したがって、次のスクリプトを試してください。

shopt -u dotglob
for eachfile in /mnt/thara/*

今隠されたファイルは消えなければなりません。

答え2

他の方法は

for eachfile in /mnt/thara/[^.]*

答え3

シェルオプションに関するコメントに同意しますdotglob。設定しないと、forループの動作が予想されます。

utente@computer:/tmp/test$ shopt | grep dotglob
dotglob         off

a、、、bc通常のファイル.hidden1.hidden2隠しファイルのままにします。

utente@computer:/tmp/test$ touch a b c .hidden1 .hidden2

utente@computer:/tmp/test$ ls -al
totale 8
drwxrwxr-x  2 utente utente 4096 giu 10 18:28 .
drwxrwxrwt 13 root   root   4096 giu 10 18:28 ..
-rw-rw-r--  1 utente utente    0 giu 10 18:28 a
-rw-rw-r--  1 utente utente    0 giu 10 18:28 b
-rw-rw-r--  1 utente utente    0 giu 10 18:28 c
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden1
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden2

ループの場合:

utente@computer:/tmp/test$ for eachfile in * ; do ls $eachfile ; done

a
b
c

findシェルオプションとは無関係なもう1つのアプローチ:初期文字にドットと一致するすべてのパス名をフィルタリングするように指示します.

utente@computer:/tmp/test$ find . \( ! -path '*/.*' \) -type f  -exec ls {} \;

./c
./b
./a

また、見ることができますこの問題superuser.comから

答え4

または非常に簡単に...

ls -l | egrep -v "^\."

または、ファイル名を表示するすべてのディレクトリを繰り返します。

ls -R | egrep -v "^\."

関連情報