Извините, если это тривиально, но как перечислить только один файл в каждом подкаталоге моей корневой папки? Терминал Linux или синтаксис MS DOS не имеет значения. Я предполагаю, что это будет команда ls или dir с каким-либо параметром, но я не нашел ничего в руководстве по этой команде.
4 ответа
Если вы хотите увидеть имена каталогов, используйте -
ls -R1 | grep -A 1 ":"
Если вы не хотите видеть имена каталогов, используйте -
ls -R1 | grep -A 1 ":" | grep -v ":"
Написал небольшой скрипт для этого.
#!/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
Следующая команда do:
for d in `find / -maxdepth 1 -mindepth 1 -type d`; do find $d -maxdepth 1 -type f | head -n1 ;done
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
в этом примере.