web-dev-qa-db-ja.com

シェルスクリプトでディレクトリ内のファイルのリストを取得する方法

シェルスクリプトを使用してディレクトリの内容を取得しようとしています。

私のスクリプトは次のとおりです。

for entry in `ls $search_dir`; do
    echo $entry
done

$search_dirは相対パスです。ただし、$search_dirには、名前に空白を含むファイルが多数含まれています。その場合、このスクリプトは予想どおりに実行されません。

私はfor entry in *を使うことができることを知っていますが、それは私の現在のディレクトリに対してのみうまくいくでしょう。

そのディレクトリに移動してfor entry in *を使用してから元に戻すことができることはわかっていますが、私の特定の状況ではそれができません。

私は2つの相対パス$search_dir$work_dirを持っています、そして私は両方に同時に取り組まなければなりません、それらを読んで、それらの中でファイルを作成/削除するなど。

だから私は今何をしますか?

シモンズ:私はbashを使います。

116
jrharshath
for entry in "$search_dir"/*
do
  echo "$entry"
done
217

ここに他の答えは素晴らしいですし、あなたの質問に答えますが、これは "ディレクトリ内のファイルのリストを取得するbash"のトップGoogleの結果です。その問題への答え:

ls $search_path > filename.txt

特定の種類(.txtファイルなど)だけが必要な場合は、

ls $search_path | grep *.txt > filename.txt

$ search_pathはオプションです。 ls> filename.txtは現在のディレクトリになります。

21
tegan
for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
17
ghostdog74

これは私が理解しやすいようにシンタックスが単純なところでそれをする方法です:

yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
   echo $eachfile
done

./は現在の作業ディレクトリですが、任意のパスに置き換えることができます。
*.txtはanything.txtを返します
端末に直接lsコマンドを入力することで、簡単に一覧表示されるものを確認できます。

基本的には、listコマンドが返すすべての要素を別の要素として含む変数yourfilenamesを作成し、それをループします。ループは一時的な変数eachfileを作成します。この変数には、ループする変数の1つの要素(この場合はファイル名)が含まれています。これは必ずしも他の答えよりも優れているわけではありませんが、lsコマンドとforループの構文に慣れているので直感的に理解できます。

13
rrr
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
10
Noel Yap
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  a
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  c
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'e; f'

$ find . -type f
./c
./b
./a
./d
./c d
./e; f

$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f

$ find . -type f | sed 's/^\.\///g' | sort > tmp

$ cat tmp
a
b
c
c d
d
e; f

バリエーション

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

注:

  • .:現在のフォルダ
  • -maxdepth 1を削除して再帰的に検索する
  • -type f:ディレクトリではなくファイルを探す(d
  • -not -path '*/\.*'.hidden_filesを返さない
  • sed 's/^\.\///g':結果リストから先頭に付いた./を削除します
1
Victoria Stuart

受け入れられた答えはファイル接頭辞aを返しません。それをするために

for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
  echo "$entry"
done
0
TrevTheDev

ディレクトリ内のファイルを一覧表示するもう1つの方法があります(他の回答ほど効率的ではありません)。

cd "search_dir"
for [ z in `echo *` ]; do
    echo "$z"
done

echo *カレントディレクトリの全ファイルを出力します。 forループは各ファイル名を反復処理してstdoutに出力します。

さらに、ディレクトリ内のディレクトリを探す場合は、これをforループ内に配置します。

if [ test -d $z ]; then
    echo "$z is a directory"
fi

test -dは、ファイルがディレクトリかどうかを調べます。

0
SnoopDogg

私が働いているLinuxバージョン(x86_64 GNU/Linux)では、以下のように動作します。

for entry in "$search_dir"/*
do
  echo "$entry"
done