2011-10-27 21 views
1

私はexamというフォルダを持っています。このフォルダには、math、physics、englishという3つのフォルダがあります。これらのフォルダには、すべてサブフォルダとファイルがあります。私はすべてのフォルダを通り抜け、すべてのフォルダとファイルのパスをファイルと呼ばれる別のファイルに出力したい。/フォルダ内のすべてのファイルをトラバースするにはどうすればよいですか?

/ホーム/学校/受験/数学

/ホーム/学校/受験/物理

/家庭:

#!/bin/bash 

LOC="/home/school/exam/*" 

{ 
    for f in $LOC 
    do 
    echo $f 
    done 
} > "files" 

私が手に出口がある:私はこれをやりました学校/試験/英語

私はコードを訪問する方法を理解することはできませんし、試験のサブフォルダに同じことを行う。助言がありますか?

PS私はシェルスクリプトの初心者です。

答えて

3
find /home/school/exam -print > files 
+0

これは機能しています。しかし、今私はそれを考えると、私はチームの一員としてこのスクリプトをやっているし、チームの誰もが試験フォルダのための別のパスを持っているので、私はそれが動作するとは思わない。これをどのように修正できますか?私はfind */exam -print>ファイルを試しましたが、そのようなファイルやディレクトリはありません。 – captain

+0

私はfind〜/ exam -print>ファイルに変更して動作します。しかし、それは確かに試験フォルダを持っている他のコンピュータで動作するでしょうか? – captain

+0

あなたの質問が分かっていれば、試験ディレクトリの親を作業ディレクトリにして、 'find -print> files'ファイルを探してください。 '〜/ exam'を使うのは、ホームディレクトリに' exam'ディレクトリがある人だけです。 –

0

あなたは、それはすべてのファイルを得ることができfindコマンドを使用することができ、あなたは、execまたは、例えばxargsのを使用して、それらに何かを行うことができます。

-1

あなたのすべてのファイルを再帰的にリストするのはいかがですか?隣接する二つの星

使用使用している場合globstarオプションのbashで

for i in *; do ls -l $i ; done 
2

は、サブディレクトリ内のすべてのファイル名を再帰ます:

shopt -s globstar 
for i in /home/school/exam/** 

をここで参照はman bashです:

globstar 
         If set, the pattern ** used in a pathname expansion context 
         will match all files and zero or more directories and 
         subdirectories. If the pattern is followed by a /, only 
         directories and subdirectories match. 

info bash

  *  Matches any string, including the null string. When the 
       globstar shell option is enabled, and * is used in a 
       pathname expansion context, two adjacent *s used as a 
       single pattern will match all files and zero or more 
       directories and subdirectories. If followed by a /, two 
       adjacent *s will match only directories and subdirecto‐ 
       ries. 
0

ほとんどの* nixディストリビューションに含まれているtreeコマンドを使用することもできます。 (ただし、Ubuntuは例外的ですが、apt-getでインストールできます)

LOC="/home/school/exam/" 
tree -if $LOC > files 
関連する問題