複数の大きなフォルダにあるすべてのファイルを検索したいのですが、.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 -exec
find
head
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
。ループ内で呼び出し、各呼び出しをパイプして最初の結果を抽出できますbash
。find
find
head
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