перелік файлів у каталозі без перерахування підкаталогів та їх вмісту в цьому каталозі


24

Я хочу створити список усіх файлів у каталозі, не перераховуючи жодного з підкаталогів, що перебувають у тому самому каталозі, і надрукувати цей список у новому файлі.

ls -d * > filelist

створить список усіх файлів у поточному каталозі, але він також містить підкаталоги в поточному каталозі. Я спробував findкоманду за допомогою -maxdepth 1параметра - однак, вихідний формат є проблемою, оскільки пошук також виводить шлях разом з іменами файлів.

Якщо хтось може, будь ласка, скажіть мені, можливо, іншу команду чи параметри для використання, що створить вихідний список лише файлів у каталозі, а не імена підкаталогів чи їх вмісту, я би вдячний.


2
Я плутати ls -d *лише список файлів і папок у поточній папці, за винятком прихованих тут файлів / папок;
GM-Script-Writer-62850

так, але я не хочу, щоб папки в цьому каталозі були в списку, лише хочу, щоб були перелічені файли в цьому каталозі
janet

Відповіді:


22

Рішення на основі пошуку:

find . -maxdepth 1 -type f -printf '%f\n'

Рішення на основі Баша:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Рішення на основі bash отримає все, що не є каталогом; вона буде включати такі речі, як названі труби (ви, мабуть, цього хочете). Якщо ви спеціально хочете лише файли , скористайтеся findкомандою або одним із них:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Якщо ви збираєтесь використовувати це регулярно, ви, звичайно, можете помістити це в псевдонім десь у вашому ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Оскільки ви зазначили в коментарях, що ви насправді на OSX, а не на Ubuntu, я б запропонував наступного разу направити питання на Apple або більш загальні сайти обміну стеками Unix & Linux .


1
Переконайтесь, що ці рішення є правильними для вас, виходячи з того, хочете ви або не хочете включити приховані файли.
Кевін Уілер

10

Список лише файлів:

1. ls -p | grep -v / (без прихованих файлів)
 2. ls -l | греп ^ - | tr -s '' | вирізати -d '' -f 9 (без прихованих файлів)

 а) лс -па | grep -v / (із прихованими файлами)
 б) ls -la | греп ^ - | tr -s '' | вирізати -d '' -f (із прихованими файлами)

Список лише каталогів:

1. ls -p | grep / (без прихованого)
 2. ls -l | греп ^ д | tr -s '' | вирізати -d '' -f 9 (без прихованого)

 а) лс -па | grep / (приховано)
 б) ls -l | греп ^ д | tr -s '' | вирізати -d '' -f 9 (приховано)

grep -v -e ^ $ - це видалити порожні рядки з результату.

Детальніше :
прапор ls -p - ставити '/' в кінці імені каталогу, -R прапор призначений для рекурсивного пошуку, -l для переліку інформації з інформацією, -a для перерахування всіх (включаючи приховані файли) з інформацією, grep -v прапор призначений для інверсії результатів і -e прапор для збігу регулярних виражень.


7

Щоб переглянути лише звичайні файли:

ls -al | grep ^-

З включеними символічними посиланнями:

ls -al | grep ^[-l]

Там, де перший символ списку описує тип файлу, так - значить, це звичайний файл, для символічного посилання є l.

Debian / Ubuntu

Роздрукуйте імена всіх відповідних файлів (включаючи посилання):

run-parts --list --regex . .

З абсолютними шляхами:

run-parts --list --regex . $PWD

Роздрукуйте імена всіх файлів, /etcщо починаються з pі закінчуються d:

run-parts --list --regex '^p.*d$' /etc

5

Ще одне, наївно коротке рішення, яке працювало на мене:

ls -la | grep -E '^[^d]' > files

ідеально підходить для мене,ls -alR |grep -E '^-'
ось

4

Я б запропонував використати find і просто видалити ім'я каталогу з виводу, якщо це необхідно:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1повинна перед будь-якими фільтрами, і ви можете досягти цього результату без використання sedз -printfопцією, тобто: find . -maxdepth 1 -type f -printf '%f\n'(це буде більш ефективним , ніж при використанні додаткової програми).
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Інший можливий варіант

ls -F | grep -v '/' | sed /[@*]$// > filelist

У --file-typeСтавить / в кінці папки (але і @ в кінці символічних посилань. The grep -v '/'Видаляє підкаталоги (бо вони тепер закінчуються символом «/»). У sed s/@$//прибирає , що @. -1 друкує один файл в кожному рядку так що grep -v буде працювати правильно.


Спасибі за вашу відповідь. на жаль, це не працює для мене, можливо, я виконую це неправильно. якщо я використовую точну команду, яку ви мені дали, я отримую таку помилку: ls: незаконний варіант - - використання: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [файл ...], я спробував використовувати символ * wildcard замість, а також у сполучення з --file-type. якби ви могли уточнити, я би оцінив це!
Джанет

Команда працює для мене (працює 13.04), яку версію ubuntu ви використовуєте ?; -1не важливо, щоб грепнути вам це не потрібно; якщо ви хочете -als
включити

насправді я працюю над Mac. можливо команда дещо відрізняється на mac os x або unix?
Джанет

1
Ви також можете спробуватиls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.