Прокручуйте файли, виключаючи каталоги


11

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

Наприклад, у поточному шляху є 5 файлів, але 1 з них - це папка (підкаталог). Мій скрипт повинен активувати команду, задану як аргументи під час запуску зазначеного сценарію. Тобто "bash script wc -w" повинен дати кількість слів кожного файлу в поточному каталозі, але не будь-яку з папок, щоб у виході ніколи не було жодного рядка "/ sub / dir: is a directory".

Мій поточний сценарій:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

Мені просто потрібно виключити каталоги для циклу, але я не знаю як.

Відповіді:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

Зауважте, що він також виключає файли, що мають тип посилання, і де символьна посилання відповідає файлу каталогу типу (який, мабуть, є тим, що ви хочете).

Альтернативно (з коментарів), перевірте лише файли:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@roaima хороша ідея!
laktak

2
Краще використовувати if [ -f "$file" ]; then .... Не каталог не повертає не тільки звичайні файли, але й сокети та посилання.
JRFerguson

@JRFerguson грунтуючись на питанні ОП, я б сказав, що включення розеток і труб було б дійсно поганою ідеєю. Що стосується символьних посилань, то вони неявно включені до ! -dвже.
roaima

Я використовував [-f $ file] у своєму остаточному сценарії. Зверніть увагу на відсутність лапок в умові if. Майже скрізь, де я шукав лапки, було розміщено близько $ файла, але мені довелося видалити їх, щоб мій сценарій працював.
Tõnis Piip

3

Ось альтернатива використанню циклу for, якщо те, що вам потрібно зробити, є простим (і не передбачає встановлення змінних у головній оболонці та c).

Ви можете використовувати findз -execі використовувати , -maxdepth 1щоб уникнути рекурсії в підкаталозі.

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

Там [ -n "$1" ]є, щоб уникнути виконання всіх файлів у каталозі, коли скрипт не передав жодних аргументів.


2

У zsh ви можете використовувати глобальні класифікатори, щоб обмежити відповідність підстановок за типом файлу. Наприклад, додавання (.)після шаблону обмежує його до звичайних файлів.

wc -w *(.)

Щоб впоратися з іменами файлів, що починаються з -або ., використовуйте wc -c -- *(.N)або wc -c ./*(.N). Якщо ви хочете включити символічні посилання і до звичайних файлів, зробіть це *(-.).

Інші загальні оболонки не мають такої функції, тому вам потрібно використовувати якийсь інший механізм фільтрації за файлами, наприклад тестування типів файлів у циклі або find.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.