Как я могу вернуть первый сопоставленный результат в каждой папке с помощью команды поиска в TCSH?

Я предполагаю, что вы используете vi.

Вы можете быстро перемещаться по сценарию Linux из vi, используя клавиши перехода по страницам вверх и вниз на клавиатуре.

Вы также можете перейти к началу или концу скрипта, используя 1G и G в vi.

1
15.06.2018, 19:51
3 ответа

find+awksolución:

find /net/*/scenes -maxdepth 1 -type f -name "*.mb" \
| awk -F'/' '{ fn = $NF; $NF = "" }!a[$0]++{ print $0 fn }' OFS='/'
  • -F'/'yOFS='/'-representan el separador de campo de entrada y salida
  • fn = $NF-almacenar el último valor de campo (, es decir, un nombre de archivo )en la variablefn
  • !a[$0]++{ print $0 fn }-en la primera aparición de la ruta de directorio única (presentada por$0)imprima la línea (la ruta de archivo completa)

O usando canalización GNU coreutils:

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

Su nueva edición especifica que está usandotcsh-Originalmente supuse que estaba usando bash. Puede llamar a finddesde dentro de una invocación find -execy canalizar cada invocación interna finda headpara extraer el primer resultado, p.

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

He aquí un pequeño ejemplo de demostración:

# 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" \;

Esto produce el siguiente resultado:

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

Originalmente, la pregunta no especificaba tcsh. En bash, puede llamar a finddesde un bucle y canalizar cada invocación finda headpara extraer el primer resultado, p.

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

He aquí un pequeño ejemplo de demostración:

# 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

Esto produce el siguiente resultado:

./abc/scenes/file1.mb
./def/scenes/file3.mb
0
27.01.2020, 23:43

Usando 2 comandos de búsqueda primero para encontrar directorios, luego para buscar en cada uno de ellos:

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

Теги

Похожие вопросы