2016-10-28 8 views
1

リスト内のすべてのファイルの各サブディレクトリにテキストファイルを作成する必要があります。
例えば、subdirectory1は、すべてのファイルのリストを.txtとし、subdirectory2にはsubdirectory2のすべてのファイルのリストが.txtとして含まれます。 私は試しました各サブディレクトリ内のすべてのファイルの.txtを作成

#!/bin/bash 
for X in "$directory" * 
do 
    if [ -d "$X" ]; 
    then 
     cd "$X" 
     files="$(ls)" 
     echo "$files" >> filesNames.txt 
    fi 
done 

しかし、これは何も生成されませんでした。私は絶対にそれがパイプラインスクリプトの一部になるので、シェルスクリプトとして必要ですが、私はそれを動作させるように見えることはできません。

ここに、私にそのようなファイルやディレクトリのコメントを与えない調節されたスクリプトがあります。私は、フォルダが存在し、このコマンドの前に実行されるコマンドでそれを使用したことを知っています。

#!/bin/bash 

#Retrieve the base directory path 
baseDir=$(dirname "$ini") 

#Retrieve the reference genome path 
ref=$(dirname "$genome") 

#Create required directory structure 
tested="$baseDir/tested" 
MarkDups1="$baseDir/MarkDups1" 

#don't create if already exists 
[[ -d "tested" ]] || mkdir "$tested" 
[[ -d "MarkDups1" ]] || mkdir "$MarkDups1" 


#create a text file with all sorted and indexed bam files paths 
#!/bin/bash 
for x in $MarkDups1/*/; 
do 
    (cd "$x"; ls > filesNames.txt) 
done 
+0

'[[-d" $ tested "]]'と '[[-d" $ MarkDups1 "]]';現在、2つの変数に格納されている名前ではなく、2つのリテラルディレクトリ名をテストしています。 – chepner

答えて

3

反復するシーケンスは"$directory"/*/である必要があります。

for x in "$directory"/*/; do 
    (cd "$x" 
    files=(*) 
    printf '%s\n' "${files[@]}" > filesNames.txt 
) 
done 
+1

ちょうど興味深いのは、 'find'やxargs/pipes等を使って、このスタイルメソッド(_for_ループとサブシェル)に大きな理由があるのでしょうか?質問者を流れ続ける以外は、 – agg3l

+0

私は不必要な変更について少し外に出ました。 'x'が絶対パス名でない場合、サブシェルは元のディレクトリに' cd'する必要を防ぎます。残りの部分は外部プログラムの呼び出しを避けるだけですが、実際には 'ls'の出力を解析していないので、' files = $(ls); echo "$ files"> filesNames.txt'はあなたができる最悪のことではありません。 – chepner

+0

'filesNames.txt'がそれ自体でリストされていることに気にしないならば、代わりに' ls> filesNames.txt'を使うことができます。 – chepner

関連する問題