Як я можу перерахувати всі файли однієї папки, але не їх папки або підфайли. Іншими словами: Як я можу перерахувати лише файли?
Як я можу перерахувати всі файли однієї папки, але не їх папки або підфайли. Іншими словами: Як я можу перерахувати лише файли?
Відповіді:
Використання find
:
find . -maxdepth 1 -type f
Використання -maxdepth 1
опції гарантує, що ви шукаєте лише поточний каталог (або, якщо ви заміните .
якийсь шлях, цей каталог). Якщо ви хочете отримати повний рекурсивний список усіх файлів у цьому та підкаталогах, просто видаліть цю опцію.
find
на mac, не має ні -type
, ні -maxdepth
опцій.
-type
і -maxdepth
не є опціями в звичайному розумінні; BSD find
(як використовується в OS X) називає їх первинними елементами , і вони повинні йти після операнда (ів) файлу ( .
у цьому випадку; зауважте, що, на відміну від Linux, версія BSD потребує принаймні одного явного операнда імені файлу); команда у цій відповіді однозначно працює на Mac.
find *.png -maxdepth 0 -type f
щоб уникнути ./
префікса в вихідних файлах, також зверніть увагу -maxdepth
на 0
, що не 1
), до тих пір , як все , що вам потрібно , це файл імена в алфавітному порядку . Якщо ви хочете, що ls
можна зробити для вас інакше (інший формат виводу / впорядкування, вбудований контроль над тим, чи включені приховані елементи чи ні), доповнений фільтруванням типу [multi-], сценарій з моєї відповіді може допомогти.
find * -maxdepth 0 -type f
(альтернатива, отримана з коментаря @ AlexHall) з find . -maxdepth 1 -type f
відповіді: find . ...
незмінно включає приховані елементи, незмінно префіксує імена вихідних файлів з ./
, і, в GNU find
(Linux), як правило, видає невідсортований список. find * ...
, завдяки дозволяючи оболонці виконувати глобалізацію вперед, за замовчуванням виключає приховані елементи (їх можна змінити за допомогою shopt -s dotglob
), виводить лише імена файлів (без префіксу), відсортовані за алфавітом. Жоден з підходів не включає символічні посилання на файли; використовувати опцію -L
для цього.
ls -p | grep -v /
ls -p дозволяє показувати / після назви папки, яка діє як тег для видалення.
ls
на додаток до find
, оскільки останній повертає відносні шляхи та перші лише імена файлів. Використовуйте відповідний інструмент для роботи.
Відповідь на find
основі carlpett ( find . -maxdepth 1 -type f
) працює в принципі, але не зовсім збігається з використанням ls
: ви отримуєте потенційно несортований список імен файлів, усі з префіксом./
, і ви втрачаєте можливість застосовувати ls
багато опцій ;
також find
незмінно знаходить також приховані предмети , тоді як ls
'поведінка залежить від наявності або відсутності параметрів -a
або -A
.
Поліпшення , запропонував Алекс Холл в коментарях з цього питання, щоб об'єднати оболонки підстановки зfind
:
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
ls
багатьох інших варіантів форматування сортування / виводу.Відповідь ls
+grep
Ганса Роггемана прагматична, але блокує вас у використанні -l
формату виводу long ( ) .
Для вирішення цих обмежень я написав утиліту fls
( f iltering ls ) ,
ls
одночасно забезпечуючи можливість фільтрації типів ,f
файли, d
каталоги та l
символьні посилання перед списком ls
аргументів (запустіть fls --help
або fls --man
дізнайтеся більше).Приклади:
fls f # list all files in current dir.
fls d -tA ~ # list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)
Підтримувані платформи
Примітка: Навіть якщо ви не використовуєте Node.js, його менеджер пакетів npm
, працює на різних платформах і його легко встановити; спробуй
curl -L https://git.io/n-install | bash
Після встановлення Node.js встановлюйте наступним чином:
[sudo] npm install fls -g
Примітка :
Чи вам це потрібно, sudo
залежить від того, як ви встановили Node.js / io.js і чи змінили ви дозволи пізніше ; якщо з'являється EACCES
помилка, спробуйте ще раз за допомогою sudo
.
-g
Забезпечує глобальну установку і необхідно поставити fls
у вашій системі $PATH
.
bash
сценарій якfls
.chmod +x fls
.$PATH
, наприклад /usr/local/bin
(macOS) або /usr/bin
(Linux).-1
(номер один); ls
фактично за замовчуванням має "голий" вихід, тобто лише імена файлів, але при виведенні в термінал використовується макет на основі стовпців (кілька імен файлів у рядку). Щоб отримати одне ім'я файлу на вихідний рядок (що саме dir /b
робить, якщо пам'ять служить), використовуйте -1
опцію, яка фактично неявно вмикається, коли stdout не підключений до терміналу, наприклад, під час надсилання до конвеєра або вихідного файлу.
Мені подобається використовувати ls
варіанти, для зразка:
-l
використовувати довгий формат списку-t
сортувати за часом модифікації, спочатку новітній-r
зворотний порядок під час сортування-F
,--classify
додати індикатор (один із * / => @ |) до записів-h
,--human-readable
з -l та -s, розміри друку, такі як 1K 234M 2G тощо ...
Десь --color
і всі інші. (Подивитисяls --help
)
Це покаже файли, символьні посилання, пристрої, трубопроводи, розетки тощо.
тому
find /some/path -maxdepth 1 ! -type d
можна легко відсортувати за датою:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
або
find /some/path -maxdepth 1 -type f
відсортовані за розміром:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Щоб не показувати приховані записи, де ім’я починається крапкою, ви можете додати ! -name '.*'
:
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Тоді
Ви могли б замінити /some/path
на .
в список для поточного каталогу або ..
для батьківського каталогу .
Ви також можете використовувати ls
з grep
або egrep
і розмістити його у своєму профілі як псевдонім:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
знайти файли: ls -l / home | grep "^ -" | tr -s '' | вирізати -d '' -f 9
знайти каталоги: ls -l / home | grep "^ d" | tr -s '' | вирізати -d '' -f 9
знайти посилання: ls -l / home | grep "^ l" | tr -s '' | вирізати -d '' -f 9
tr -s '' перетворює вихідні дані у файл, розділений пробілом, команда cut вирішує, що роздільник є пробілом, і повертає 9-те поле (завжди ім'я файлу / ім'я каталогу / ім'я посилання).
Я цим увесь час користуюся!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
додано, xargs
щоб це працювало, і використовується -1
замість того, -l
щоб показувати лише імена файлів без додаткової ls
інформації
find -printf0 '...' | sort -z
Просто додавши відповідь Карлпетта. Для набагато кориснішого перегляду файлів ви можете направити вихідні дані до ls.
find . -maxdepth 1 -type f|ls -lt|less
Показує останні нещодавно змінені файли у форматі списку, дуже корисно, коли ви завантажили багато файлів і хочете побачити незавантажену версію останніх.
ls
не читає стандартний ввід, тому марно що-небудь передавати ls
. Ви сумували xargs
?
find
команда в цій відповіді повністю ігнорується ; загальна команда така сама ls -lt | less
, яка не виконує фільтрування типів.
find
ви могли б це зробити find . -maxdepth 1 -type f -ls
. Вона також , здається, працює на Mac OS, хоча я вважаю , -maxdepth
і -ls
неправильно портативні варіанти.
"find '-maxdepth'" не працює з моєю старою версією bash, тому я використовую:
для f в $ (ls); робити якщо [-f $ f]; потім echo $ f; fi; зроблено
for f in $(ls)
вдвічі неправильніше. Ви можете виправити це за допомогою, for f in *
але тоді це зламається, тому що ви не цитуєте аргументecho
.