tcshでfindコマンドを使用して各フォルダで最初に一致する結果を返すにはどうすればよいですか?

tcshでfindコマンドを使用して各フォルダで最初に一致する結果を返すにはどうすればよいですか?

複数の大きなフォルダにあるすべてのファイルを検索したいのですが、.mb検索基準に一致するファイルが多い場合は、各フォルダから1つのファイルのみを返したいと思います。

フォルダ構造

..
--abc
    |_scenes
    |    |__  file1.mb
    |    |__  file2.mb
    |...
--def
    |_scenes
    |    |__  file3.mb
    |    |__  file4.mb
    |...

もし私がするなら

find /net/*/scenes -maxdepth 1 -type f -size +200M

それはすべてを返します

file1.mb
file2.mb
file3.mb
file4.mb

file1.mb合計のみを返すにはどうすればよいですかfile3.mb

答え1

find+awk解決策:

find /net/*/scenes -maxdepth 1 -type f -name "*.mb" \
| awk -F'/' '{ fn = $NF; $NF = "" }!a[$0]++{ print $0 fn }' OFS='/'
  • -F'/'およびOFS='/'- 入力および出力フィールドの区切り記号を表します。
  • fn = $NF- 最後のフィールド値(ファイル名など)を変数に保存します。fn
  • !a[$0]++{ print $0 fn }- 一意のディレクトリパスが最初に表示されたときにこの行$0(フルファイルパス)を印刷します(次のように表示されます)。

またはGNUcoreutilsパイプを使用してください。

find /net/*/scenes -maxdepth 1 -type f -name "*.mb" -printf "%H %p\n" \
| sort -k1,1 -u | cut -d' ' -f2

答え2

あなたの新しい編集内容は、あなたtcshが最初に使用していると仮定しましたbash。呼び出し内findで呼び出し、各内部呼び出しをパイプして最初の結果を抽出できます。find -execfindhead

find /net/* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;

以下は簡単な例のデモです。

# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes

# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1

# Execute the find command
find ./* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;

これにより、次のような出力が生成されます。

./abc/scenes/file1.mb
./def/scenes/file3.mb

元の質問は指定されていませんtcsh。ループ内で呼び出し、各呼び出しをパイプして最初の結果を抽出できますbashfindfindhead

for directory in /net/*/scenes; do
    find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done

以下は簡単な例のデモです。

# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes

# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1

# Execute the find command
for directory in ./*/scenes; do
    find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done

これにより、次のような出力が生成されます。

./abc/scenes/file1.mb
./def/scenes/file3.mb

答え3

まず、2つのfindコマンドを使用してディレクトリを見つけ、各ディレクトリ内で検索します。

while read dir; do find "$dir" -name "*.mb" -maxdepth 1 | head -1 ; done << EOF
$(find /net/*/scenes -type d)
EOF

関連情報