シェルスクリプトを使用してディレクトリの内容を取得しようとしています。
私のスクリプトは次のとおりです。
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を使います。
for entry in "$search_dir"/*
do
echo "$entry"
done
ここに他の答えは素晴らしいですし、あなたの質問に答えますが、これは "ディレクトリ内のファイルのリストを取得するbash"のトップGoogleの結果です。その問題への答え:
ls $search_path > filename.txt
特定の種類(.txtファイルなど)だけが必要な場合は、
ls $search_path | grep *.txt > filename.txt
$ search_pathはオプションです。 ls> filename.txtは現在のディレクトリになります。
for entry in "$search_dir"/* "$work_dir"/*
do
if [ -f "$entry" ];then
echo "$entry"
fi
done
これは私が理解しやすいようにシンタックスが単純なところでそれをする方法です:
yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
echo $eachfile
done
./
は現在の作業ディレクトリですが、任意のパスに置き換えることができます。*.txt
はanything.txtを返します
端末に直接ls
コマンドを入力することで、簡単に一覧表示されるものを確認できます。
基本的には、listコマンドが返すすべての要素を別の要素として含む変数yourfilenames
を作成し、それをループします。ループは一時的な変数eachfile
を作成します。この変数には、ループする変数の1つの要素(この場合はファイル名)が含まれています。これは必ずしも他の答えよりも優れているわけではありませんが、ls
コマンドとforループの構文に慣れているので直感的に理解できます。
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
$ 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'
:結果リストから先頭に付いた./
を削除します受け入れられた答えはファイル接頭辞aを返しません。それをするために
for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
echo "$entry"
done
ディレクトリ内のファイルを一覧表示するもう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
は、ファイルがディレクトリかどうかを調べます。
私が働いているLinuxバージョン(x86_64 GNU/Linux)では、以下のように動作します。
for entry in "$search_dir"/*
do
echo "$entry"
done