2

特定のファイルを持たないすべてのディレクトリに対してプログラムを実行し、同じディレクトリに出力ファイルを作成するには、Bash スクリプトが必要です。このプログラムには、すべてのディレクトリに*.DNA.fastaという名前の入力ファイルが必要です。サブディレクトリも含む可能性のある次のディレクトリがあります

dir1/a.protein.fasta  
dir2/b.protein.fasta  
dir3/anyfile  
dir4/x.orf.fasta

私は、名前が*. protein.fasta
である特定のファイルを持たないディレクトリを見つけることから始めまし た。dir3dir4*.protein.fasta

find . -maxdepth 1  -type d  \! -exec test -e '{}/*protein.fasta' \; -print

しかし、うまくいかないことを見逃したようです。また、ストーリー全体の進め方もわかりません。

4

2 に答える 2

2

これはトリッキーです。

いい解決策が思いつきません。しかし、それにもかかわらず、ここに解決策があります。ディレクトリまたはファイル名に改行が含まれている場合、これは機能しないことが保証されており、他の特殊文字が含まれている場合は機能しないことが保証されていることに注意してください。(私はあなたの質問のサンプルでのみテストしました。)

また、-maxdepthサブディレクトリも検索する必要があると言ったので、 a は含めませんでした。

#!/bin/bash

# Create an associative array
declare -A excludes

# Build an associative array of directories containing the file
while read line; do
  excludes[$(dirname "$line")]=1
  echo "excluded: $(dirname "$line")" >&2
done <<EOT
$(find . -name "*protein.fasta" -print)
EOT

# Walk through all directories, print only those not in array
find . -type d \
| while read line ; do
  if [[ ! ${excludes[$line]} ]]; then
    echo "$line"
  fi
done

私にとって、これは次を返します:

.
./dir3
./dir4

これらはすべて、一致するファイルを含まないディレクトリです*.protein.fasta。もちろん、最後echo "$line"のディレクトリは、これらのディレクトリで行う必要があるものに置き換えることができます。

別の方法:

本当に探しているのが、どのサブディレクトリにも一致するファイルを含まない最上位ディレクトリのリストだけである場合は、次の bash ワンライナーで十分な場合があります。

for i in *; do test -d "$i" && ( find "$i" -name '*protein.fasta' | grep -q . || echo "$i" ); done
于 2012-08-13T11:27:14.980 に答える
0
#!/bin/bash

for dir in *; do

test -d "$dir" && ( find "$dir" -name '*protein.fasta' | grep -q . ||     Programfoo"$dir/$dir.DNA.fasta");
done
于 2012-08-13T15:08:08.777 に答える