Извините, если это тривиально, но как перечислить только один файл в каждом подкаталоге моей корневой папки? Терминал 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 в этом примере.
