Як я можу перерахувати всі файли однієї папки, але не їх папки або підфайли. Іншими словами: Як я можу перерахувати лише файли?
Як я можу перерахувати всі файли однієї папки, але не їх папки або підфайли. Іншими словами: Як я можу перерахувати лише файли?
Відповіді:
Використання 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 .