У меня вопрос
Я пытаюсь выполнить некоторую функцию, например
DIR =/путь/TMP/
если [-d "$ DIR" ]; то
и
если [-f "$ DIR" ]; то
но только check/path/tmp этот путь
как я могу это сделать?
У меня вопрос
Я пытаюсь выполнить некоторую функцию, например
DIR =/путь/TMP/
если [-d "$ DIR" ]; то
и
если [-f "$ DIR" ]; то
но только check/path/tmp этот путь
как я могу это сделать?
Вы можете использовать ls -A
для этого:
if [ "$(ls -A "$DIR" 2> /dev/null)" == "" ]; then
# The directory is empty
fi
-A
показывает все скрытые файлы и каталоги, за исключением .
и ..
, которые всегда есть, поэтому он будет пустым в пустом каталоге и не пустым в каталоге с любыми файлами или подкаталогами.
2> /dev/null
отбрасывает любые сообщения об ошибках ls
может печатать (обратите внимание, что проверка несуществующего каталога приведет к ложному срабатыванию, но вы сказали, что уже проверили, что он существует). Проверка каталога, в котором у вас нет доступа на чтение, также дает ложный результат.
shopt -s nullglob dotglob
files=(*)
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob
Этот небольшой script заполняет массив files
каждым файлом, найденным в расширении пути *
. Затем он проверяет размер массива и, если он 0, он печатает "каталог пуст". Это будет работать со скрытыми файлами благодаря использованию dotglob
.
Ответы, которые просят разобрать ls
, как правило, плохая идея и плохая форма. Чтобы понять, почему, прочитайте Почему вы не должны анализировать вывод ls
[ -z "$(find "$DIR" -maxdepth 0 -empty)" ] || echo "$DIR is empty!"
find
имеет предикат -empty
, который проверяет, является ли каталог или файл пустым, поэтому он будет перечислять каталог только в том случае, если он пуст. -z
проверяет, является ли вывод find пустым. Если это так, то каталог содержит записи, если он не является пустым.
В других кодовых словах:
[ -n "$(find "$DIR" -maxdepth 0 -empty)" ] && echo "$DIR is empty!"
Еще один приятный вариант:
if ! ls -AU "$DIR" | read _; then
echo "$DIR is empty!"
fi
Почему бы не использовать ls -v
? поэтому будет распечатываться пустым, если нет файла, такого как
if $(ls -v $DIR)
rmdir "$DIR"
Если $?
равно 1, каталог не пуст. Если 0, оно пустое и оно удаляется.
Вы можете воссоздать его, если вы не собираетесь его удалять: mkdir "$DIR"
Это говорит мне, что каталог пуст или нет, количество файлов, которое оно содержит.
directory="/path/tmp"
number_of_files=$(ls -A $directory | wc -l)
if [ "$number_of_files" == "0" ]; then
echo "directory $directory is empty"
else
echo "directory $directory contains $number_of_files files"
fi
Для этого используйте только встроенные оболочки (он должен работать для всех оболочек, с которыми я работал):
if test "`echo /tmp/testdir/* /tmp/testdir/.?*`" = \
"/tmp/testdir/* /tmp/testdir/.."; then
[...]
fi
Мы не проверяем /tmp/testdir/.*, потому что это будет расширяться до /tmp/testdir/./tmp/testdir/.. для пустой папки.
Другой вариант:
for i in /tmp/testdir/* /tmp/testdir/.?*; do
test -e $i || break
[...]
break
done