5

Извините, если это тривиально, но как перечислить только один файл в каждом подкаталоге моей корневой папки? Терминал Linux или синтаксис MS DOS не имеет значения. Я предполагаю, что это будет команда ls или dir с каким-либо параметром, но я не нашел ничего в руководстве по этой команде.

4 ответа4

2

Если вы хотите увидеть имена каталогов, используйте -

ls -R1 | grep -A 1 ":"

Если вы не хотите видеть имена каталогов, используйте -

ls -R1 | grep -A 1 ":" | grep -v ":"

0

Написал небольшой скрипт для этого.

#!/bin/bash
for dir in `find . -type d` # Find directories recursively
do
  # cd into directory, quotes are for directory names with spaces
  cd "$dir"             

  # Print out directory name
  echo "In directory $dir:"

  # Force list output to be one entry per line, pipe through inverted grep to 
  # exclude directories, pipe through awk to get the first item. You can specify
  # the number of files you want.     
  ls -p1 | grep -v / | awk -v "num_of_files=1" 'NR<=num_of_files { print $1 }'

  # cd back to root directory
  cd "$OLDPWD"              
done

Выход:

In directory .:
test.sh
In directory ./bar:
barfile.txt
In directory ./baz:
bazfile.txt
In directory ./baz/quux:
something.txt
In directory ./foo:
foofile.txt
0

Следующая команда do:

for d in `find / -maxdepth 1 -mindepth 1 -type d`; do find $d -maxdepth 1 -type f | head -n1 ;done
0
find -type d -print0 | xargs -0 ls | awk '/^\.\//||newdir{newdir=!newdir;print}'
  • find -type d возвращает все подкаталоги в текущий каталог.
  • -print0 и -0 заботятся о проблемных именах файлов (пробелы, переводы строк и т. д.).
  • Команда cryptic awk продолжится, если начало строки совпадает с ./ (что обозначает каталоги) ИЛИ, если переменная newdir имеет значение true . Если это продолжится, newdir будет установлен на противоположную (т. Е. true если это false и наоборот) и напечатает строку.

Некоторая проработка в части awk : когда встречается каталог, newdir который по умолчанию имеет значение false (поскольку он не установлен), будет установлен в значение true и каталог будет напечатан. На следующей строке ^\.\/ будет совпадать, но newdir теперь будет true и скобка будет снова запущена. Теперь для newdir будет установлено противоположное значение (false), и строка будет напечатана. Теперь никакие строки не будут напечатаны, пока не появится следующий каталог.

Имена файлов со встроенными символами новой строки не будут корректно обрабатываться awk в этом примере.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .