Скрипт bash для поиска самого большого файла путем разбора текстового дерева

Проверьте, существует ли файл

При проверке, существует ли файл, чаще всего используются операторы FILE -e и -f. Первый проверит, существует ли файл независимо от типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).

Наиболее читаемым вариантом при проверке файла является использование команды test в сочетании с оператором if. Любой из приведенных ниже фрагментов проверит, /etc/resolv.conf существует ли файл:

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE существует"
fi
FILE=/etc/resolv.conf
if ; then
    echo "$FILE существует"
fi
FILE=/etc/resolv.conf
if ]; then
    echo "$FILE существует"
fi

Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if/then:

FILE=/etc/resolv.conf
if ; then
    echo "$FILE существует"
else 
    echo "$FILE не существует"
fi

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

Вы также можете использовать команду test без оператора if. Команда после оператора && будет выполнена только в том случае, если статус выхода команды test равен true,

test -f /etc/resolv.conf && echo "$FILE существует"
[ -f /etc/resolv.conf ] && echo "$FILE существует"
[[ -f /etc/resolv.conf ] && echo "$FILE существует"

Если вы хотите выполнить серию команд после оператора &&, просто заключите команды в фигурные скобки, разделенные ; или &&:

[ -f /etc/resolv.conf ] && { echo "$FILE существует"; cp "$FILE" /tmp/; }

Напротив оператор &&, после оператора || будет выполняться только в том случае, если статус выхода команды test равен false.

[ -f /etc/resolv.conf ] && echo "$FILE существует" || echo "$FILE не существует"

Проверьте, существует ли файл

При проверке существования файла чаще всего используются операторы FILE и . Первый проверит, существует ли файл независимо от его типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).

Наиболее читаемым вариантом при проверке существования файла является использование команды в сочетании с оператором . Любой из фрагментов ниже проверит, существует ли файл:

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

Вы также можете использовать команду test без оператора if. Команда после оператора будет выполнена только в том случае, если статус выхода тестовой команды равен true,

Если вы хотите выполнить серию команд после оператора, просто заключите команды в фигурные скобки, разделенные или :

Напротив , оператор после оператора будет выполняться только в том случае, если статус выхода команды test равен .

2 ответа

Лучший ответ

Просто отсортируйте список по номерам и возьмите первую строку:

У меня такое ощущение, что у вас есть довольно большой сценарий для составления списка. Список также немного небезопасен. Что произойдет, если имя файла содержит символ новой строки (да, это возможно в Linux)? Следующая команда находит самый большой файл и в текущем каталоге (включая подкаталоги) и печатает его размер и имя.

Если вам нужен только файл, добавьте в конец.

1

Socowi
18 Мар 2017 в 14:43

Не используйте . Вместо этого просто переберите файлы и вызовите , чтобы получить размер каждого файла, помня самый большой файл, который когда-либо видел. В 4 или позже это так же просто, как

Если у вас есть , это так же просто, как .

В более ранней версии вам нужно определить рекурсивную функцию для симуляции :

(Обратите внимание, что вам следует обратиться к локальной документации для точной формы команды , которая может варьироваться. Например, BSD использует вместо

)

Одно из возражений состоит в том, что требуется несколько вызовов . Это дорого, но избегает (по общему признанию редкого) вопроса работы с последовательностями имен файлов (что сложно, когда имена файлов могут содержать переводы строк).

Если у вас есть , это так же просто, как . Если вы на самом деле используете , тогда это просто .

Если вы решили не беспокоиться об именах файлов с символами новой строки, вы можете сделать следующее:

Я оставляю работу с именами файлов, содержащими новые строки, в качестве упражнения для читателя; как правило, я бы просто использовал другой язык, который может правильно представлять последовательности произвольных строк. Другой вариант — посмотреть на команду , находящуюся в каталоге исходного дистрибутива . Это пример создания встроенной команды оболочки, которая делает то же самое, что и , без создания нового процесса. Его можно изменить, добавив параметр , аналогичный тому, который поддерживается , чтобы вы могли установить переменную оболочки из выходных данных.

1

chepner
18 Мар 2017 в 14:56

Операторы проверки файлов

Команда test включает в себя следующие операторы FILE, которые позволяют вам тестировать определенные типы файлов:

  • — Истина, если ФАЙЛ существует и является специальным файлом блока.
  • — Истина, если ФАЙЛ существует и является файлом специальных символов.
  • — Истина, если ФАЙЛ существует и является каталогом.
  • — Истина, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
  • — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
  • — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
  • — Истина, если ФАЙЛ существует и является символической ссылкой.
  • — Истина, если ФАЙЛ существует и установлен флаг set -group-id ( ).
  • — Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
  • — Истина, если ФАЙЛ существует и является символической ссылкой.
  • — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
  • — Истина, если ФАЙЛ существует и является каналом.
  • — Истина, если ФАЙЛ существует и доступен для чтения.
  • — Истина, если ФАЙЛ существует и является сокетом.
  • — Истина, если ФАЙЛ существует и имеет ненулевой размер.
  • — Истина, если ФАЙЛ существует и установлен флаг set-user-id ( ).
  • — Истина, если ФАЙЛ существует и доступен для записи.
  • — Истина, если ФАЙЛ существует и является исполняемым.

Операторы проверки файлов

Команда test включает в себя следующие операторы FILE, которые позволяют тестировать определенные типы файлов:

  • -b FILE – Истина, если ФАЙЛ существует и является специальным файлом блока.
  • -c FILE – Истина, если ФАЙЛ существует и является файлом специальных символов.
  • -d FILE – Истина, если ФАЙЛ существует и является каталогом.
  • -e FILE – Истинно, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
  • -f FILE – Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
  • -G FILE – Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
  • -h FILE – Истина, если ФАЙЛ существует и является символической ссылкой.
  • -g FILE – Истина, если ФАЙЛ существует и установлен флаг set-group-id (sgid).
  • -k FILE – Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
  • -L FILE – Истина, если ФАЙЛ существует и является символической ссылкой.
  • -O FILE – Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
  • -p FILE – Истина, если ФАЙЛ существует и является каналом.
  • -r FILE – Истина, если ФАЙЛ существует и доступен для чтения.
  • -S FILE – Истина, если ФАЙЛ существует и является сокетом.
  • -s FILE – Истина, если ФАЙЛ существует и имеет ненулевой размер.
  • -u FILE – Истина, если установлен флаг set-user-id (suid).
  • -w FILE – Истина, если ФАЙЛ существует и доступен для записи.
  • -x FILE – Истина, если ФАЙЛ существует и является исполняемым.

& — «фоновый процесс»

После того, как Вы введете команду в окне терминала и она завершится, Вы вернетесь в командную строку. Как правило, — это занимает всего минуту или две. Но если вы запустите другое приложение, например gedit, вы не сможете использовать окно терминала, пока не закроете приложение.

Однако вы можете запустить приложение как фоновый процесс и продолжать использовать окно терминала. Для этого просто добавьте амперсанд в командную строку:

gedit command_address.page &

Bash показывает идентификатор процесса, который был запущен, а затем возвращает вас в командную строку. Затем Вы можете продолжать использовать окно терминала.

? — как знак подстановки символа

Оболочка Bash поддерживает три символа подстановки, одним из которых является знак вопроса (?). Вы используете «подстановочные» знаки для замены символов в шаблонах имен файлов. Имя файла, которое содержит «подстановочный» знак, формирует шаблон, который соответствует диапазону имен файлов, а не одному.

«Подстановочный» знак вопроса представляет ровно один символ. Рассмотрим следующий шаблон имени файла:

ls badge? .txt

Это переводится как: «перечислить любой файл с именем, начинающимся с «badge» и сопровождаемым любым отдельным символом перед расширением имени файла».

Это соответствует следующим файлам

Обратите внимание, что у некоторых есть цифры, а у некоторых есть буквы после части имени файла в виде значка. «Подстановочный» знак вопроса будет соответствовать как буквам, так и цифрам

Этот шаблон имени файла не соответствует значению «badge.txt», поскольку в имени файла нет ни одного символа между «значком» и расширением файла. «Подстановочный» знак вопроса должен совпадать с соответствующим символом в имени файла.

Вы также можете использовать знак вопроса, чтобы найти все файлы с определенным количеством символов в именах файлов. Здесь перечислены все текстовые файлы, которые содержат ровно пять символов в имени файла:

ls ?????. txt

Класс Directory

Класс — это статический класс, предоставляющий ряд статических методов для управления каталогами. Некоторые из этих методов:

  • — создает каталог по указанному пути
  • — удаляет каталог по указанному пути
  • — определяет, существует ли каталог по указанному пути . Если существует, возвращается , если не существует, то 
  • — получает список каталогов в каталоге
  • — получает список файлов в каталоге
  • — перемещает каталог
  • — получение родительского каталога
  • — возвращает для заданного пути сведения о томе и корневом каталоге по отдельности или сразу
  • — получает текущий рабочий каталог приложения

Получим список всех каталогов в каталоге C:\Windows:

foreach (string sub in Directory.GetDirectories(@"C:\Windows"))
    Console.WriteLine($"   {sub}");

Результат вывода будет примерно следующим:

C:\Windows\addins
C:\Windows\appcompat
C:\Windows\apppatch
C:\Windows\AppReadiness
C:\Windows\assembly
C:\Windows\bcastdvr
C:\Windows\BitLockerDiscoveryVolumeContents
C:\Windows\Boot
C:\Windows\Branding
C:\Windows\BrowserCore
C:\Windows\CbsTemp
Обратите внимание как записан путь к каталогу Windows. Мы использовали (символ @).. Для получения каталога из которого было запущено приложение можно воспользоваться методом

Например,

Для получения каталога из которого было запущено приложение можно воспользоваться методом . Например,

string curDir = Directory.GetCurrentDirectory();
Console.WriteLine($"Программа запущена из каталога: {curDir}");

Результат может быть примерно таким:

Программа запущена из каталога: C:\Users\username\source\repos\FileSystem\bin\Debug\net5.0

How to Check if a File or Directory Exists in Bash

7 Июня 2020
|

Терминал

Во многих случаях при написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.

Команда test принимает одну из следующих синтаксических форм:

Если вы хотите, чтобы ваш скрипт был переносимым, вам следует использовать старую команду test , которая доступна во всех оболочках POSIX. Новая обновленная версия команды test (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.

Проверьте, существует ли файл

При проверке существования файла чаще всего используются операторы FILE и . Первый проверит, существует ли файл независимо от его типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).

Наиболее читаемым вариантом при проверке существования файла является использование команды в сочетании с оператором . Любой из фрагментов ниже проверит, существует ли файл:

Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if / then:

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

Вы также можете использовать команду test без оператора if. Команда после оператора будет выполнена только в том случае, если статус выхода тестовой команды равен true,

Если вы хотите выполнить серию команд после оператора, просто заключите команды в фигурные скобки, разделенные или :

Напротив , оператор после оператора будет выполняться только в том случае, если статус выхода команды test равен .

Операторы позволяют проверить, является ли файл каталогом или нет.

Например, чтобы проверить, существует ли каталог, вы должны использовать:

Вы также можете использовать двойные скобки вместо одной .

Проверьте, не существует ли файл 

Как и во многих других языках, тестовое выражение можно отменить, используя логический оператор not (восклицательный знак):

То же, что и выше:

Проверьте, существует ли несколько файлов

Вместо использования сложных вложенных конструкций if / else вы можете использовать (или с ), чтобы проверить, существует ли несколько файлов:

Эквивалентные варианты без использования оператора IF:

Операторы проверки файлов

Команда test включает в себя следующие операторы FILE, которые позволяют вам тестировать определенные типы файлов:

  • — Истина, если ФАЙЛ существует и является специальным файлом блока.
  • — Истина, если ФАЙЛ существует и является файлом специальных символов.
  • — Истина, если ФАЙЛ существует и является каталогом.
  • — Истина, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
  • — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
  • — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
  • — Истина, если ФАЙЛ существует и является символической ссылкой.
  • — Истина, если ФАЙЛ существует и установлен флаг set -group-id ( ).
  • — Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
  • — Истина, если ФАЙЛ существует и является символической ссылкой.
  • — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
  • — Истина, если ФАЙЛ существует и является каналом.
  • — Истина, если ФАЙЛ существует и доступен для чтения.
  • — Истина, если ФАЙЛ существует и является сокетом.
  • — Истина, если ФАЙЛ существует и имеет ненулевой размер.
  • — Истина, если ФАЙЛ существует и установлен флаг set-user-id ( ).
  • — Истина, если ФАЙЛ существует и доступен для записи.
  • — Истина, если ФАЙЛ существует и является исполняемым.

В этом руководстве мы показали, как проверить, существует ли файл или каталог в Bash.

! — логический оператор НЕ и оператор истории

Восклицательный знак (!) — это логический оператор, который означает НЕ.

В этой командной строке есть две команды:

[! -d ./backup] && mkdir ./backup
  • Первая команда — это текст в квадратных скобках;
  • Вторая команда — это текст, который следует за двойными амперсандами &&.

Первая команда использует ! в качестве логического оператора. Квадратные скобки указывают на то, что будет проведено испытание. Опция  -d (directory) проверяет наличие каталога с именем backup. Вторая команда создает каталог.

Поскольку двойные амперсанды разделяют две команды, Bash выполнит вторую только в случае успеха первой  . Однако это противоположность того, что нам нужно. Если проверка для «резервной» директории прошла успешно, нам не нужно её создавать. И если проверка для каталога «backup» не пройдена, вторая команда не будет выполнена, а отсутствующий каталог не будет создан.

Это где логический оператор ! входит. Он действует как логическое НЕ. Таким образом, если тест пройден успешно (т.е каталог существует), он ! переходит на «НЕ успешно», что является ошибкой. Итак, вторая команда не активирована.

Если проверка каталога не пройдена (т.е каталог не существует), ! ответ изменяется на «НЕ сбой», что является успехом . Таким образом, команда для создания недостающего каталога будет выполнена.

Чтобы проверить состояние папки резервной копии, вы используете ls команду и параметры -l (длинный список) и -d (каталог), как показано ниже:

ls -l -d backup

Вы также можете запускать команды из истории команд с восклицательным знаком. Команда history выводит список вашей истории команд, а затем Вы набираете номер команды, с которой хотите выполнить ее повторно !, как показано ниже:

!24

Следующая команда повторно запускает предыдущую команду:

!!

Дополнительная информация

Явное знание того, что каталог существует или не существует, может оказаться сложной задачей, когда в игру вступят права доступа. Возможно, что при попытке определить, существует ли каталог, процесс не имеет разрешений на доступ к каталогу или родительскому каталогу. Это подходит для моих нужд . Если каталог не существует ИЛИ я не могу получить к нему доступ, оба они рассматриваются как сбой недопустимого пути в моем приложении, поэтому мне не нужно различать. (Виртуальные) бонусные баллы, если ваше решение предусматривает это различие.

Любое решение на языке C, библиотеке времени выполнения C или Win32 API подойдет, но в идеале я хотел бы придерживаться библиотек, которые обычно загружаются (например, kernel32, user32 и т. Д.), И избегать решений, связанных с загрузкой нестандартных библиотек. (например, PathFileExists в Shlwapi.dll ). Опять же, (виртуальные) бонусные баллы, если ваше решение кроссплатформенное.

5 ответов

Лучший ответ

Сделайте что-нибудь вроде этого:

Метод GetFileAttributes () включен в Kernel32.dll.

99

Zach Burlingame
2 Июн 2011 в 18:39

Итак, этот вопрос полон крайних случаев. Настоящий ответ будет таким:

Правильный результат DirectoryExists — три состояния. Есть три случая, и вам нужно разобраться со всеми. Либо он существует, либо не существует, либо вы не смогли проверить. Я потерял данные в процессе производства, потому что SAN вернул NO функции проверки, а затем позволил мне создать что-то, что сбивает их с толку, в следующей строке кода. Не делайте той же ошибки, которую сделала Microsoft при разработке API на C #.

Однако я вижу много сомнительных проверок. Не пишите, думает, что каталог не существует ; просто напишите . Или наоборот с ; просто удалите его и проверьте, нет ли ошибок или путь не найден.

Joshua
29 Янв 2021 в 04:58

Другой вариант — функция оболочки PathFileExists ()

Эта функция «определяет, действителен ли путь к объекту файловой системы, например, к файлу или каталогу».

5

Greg
28 Авг 2014 в 03:10

Если вам подходит ссылка на Shell Lightweight API (shlwapi.dll), вы можете использовать функция PathIsDirectory.

9

Simon Mourier
23 Мар 2013 в 07:37

Вот полностью независимое от платформы решение (с использованием стандартной библиотеки C)

Изменить: для компиляции в Linux замените на и на . Для решения, не зависящего от платформы, используйте библиотеку Boost FileSystem.

Реализация для Windows, поддерживающая сборки как MBCS, так и UNICODE:

24

dario_ramos
1 Окт 2013 в 13:02

Что такое специальные символы?

Существует набор символов, которые оболочка Bashобрабатывает двумя различными способами. Когда вы вводите их в оболочку, они действуют как инструкции или команды и сообщают оболочке выполнить определенную функцию. Думайте о них как об односимвольных командах.

Иногда вам просто нужно напечатать символ, и вам не нужно, чтобы он действовал как «магический». Есть способ, которым вы можете использовать символ, чтобы представлять себя, а не его специальную функцию.

Мы покажем вам, какие символы являются «специальными» или «мета-» символами, а также как вы можете использовать их функционально и буквально.

Многие команды Linux принимают файл в качестве параметра и берут свои данные из этого файла. Большинство из этих команд также могут принимать данные из потока. Чтобы создать поток, используйте левую угловую скобку (<), как показано в следующем примере, чтобы перенаправить файл в команду:

sort < words.txt

Когда команда перенаправляет ввод в нее, она может вести себя иначе, чем при чтении из именованного файла.

Если мы используем wc для подсчета слов, строк и символов в файле, он печатает значения, а затем имя файла. Если мы перенаправим содержимое файла wc, он печатает те же числовые значения, но не знает имени файла, из которого поступили данные. Он не может напечатать имя файла.

Вот несколько примеров того, как вы можете использовать wc:

wc words.txt
wc < words.txt

Класс DirectoryInfo

Данный класс предоставляет функциональность для создания, удаления, перемещения и других операций с каталогами. Вот только некоторые из его свойств и методов:

  • : создает каталог
  • : создает подкаталог по указанному пути path
  • : удаляет каталог
  • Свойство : определяет, существует ли каталог
  • : получает список каталогов
  • : получает список файлов
  • : перемещает каталог
  • Свойство : получение родительского каталога
  • Свойство : получение корневого каталога

Как можно видеть по описанию свойств и методов, часть того, что у класса определено как метод (например, ) в определено как свойство, что позволяет использовать объект класса многократно, избегая возможно лишних проверок.

Для создания каталогов и подкаталогов в C# используются методы и . Рассмотрим использование этих методов в следующем примере:

static void Main(string[] args)
{
    string root = @"C:\CSharp Output\";
    string subDir = @"FileSystem\bin";
    DirectoryInfo directory = new DirectoryInfo(root);
    if (!directory.Exists)
    {
        directory.Create();
    }
    DirectoryInfo newDir = directory.CreateSubdirectory(subDir);
    Console.WriteLine(newDir.FullName);
}

В этом примере мы вначале проверяем наличие директории, используя свойство и, если директория отсутствует, то создаем её. На втором шаге мы, используя метод , создаем подкаталог. Вывод консоли будет выглядеть следующим образом:

C:\CSharp Output\FileSystem\bin

У класса есть все необходимые методы для получения информации о каталоге. Например:

    static void Main(string[] args)
    {
        string root = @"C:\CSharp Output\";
        string subDir = @"FileSystem\bin";
        DirectoryInfo directory = new DirectoryInfo(root);
        if (!directory.Exists)
        {
            directory.Create();
        }
        DirectoryInfo newDir = directory.CreateSubdirectory(subDir);
        Console.WriteLine(newDir.FullName);
        //получаем информацию о каталоге
        Console.WriteLine($"Время создания каталога: {newDir.CreationTime}");
        Console.WriteLine($"Время последнего доступа: {newDir.LastAccessTime}");
        Console.WriteLine($"Время последней записи в каталог: {newDir.LastWriteTime}");
        if ((newDir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
            Console.WriteLine("скрытый каталог");
        else
            Console.WriteLine("обычный каталог");
    }
}

Вывод консоли будет следующим:

C:\CSharp Output\FileSystem\bin
Время создания каталога: 18.10.2021 12:34:06
Время последнего доступа: 18.10.2021 12:34:06
Время последней записи в каталог: 18.10.2021 12:34:06
обычный каталог

Для того, чтобы сделать каталог скрытым мы можем добавить к его атрибутам атрибут FileAttributes.Hidden используя оператор ИЛИ (). Например допишем предыдущий пример следующим образом:

//делаем каталог скрытым
newDir.Attributes |= FileAttributes.Hidden;
//проверяем атрибут
if ((newDir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
    Console.WriteLine($"теперь каталог {newDir} скрыт");
else
    Console.WriteLine("обычный каталог");

Будет скрыта последняя папка (в примере — это ). Вывод консоли:

теперь каталог C:\CSharp Output\FileSystem\bin скрыт

Для удаления каталога в C# может использоваться метод

При этом, следует обратить внимание, что простой вызов этого метода (без параметров) вызовет исключение в том случае, если вы попытаетесь удалить каталог в котором находятся какие-либо другие элементы, например, файлы. Поэтому, если вам необходимо удалить каталог со всем содержимым, то необходимо выполнить следующим код:

string root = @"C:\CSharp Output\FileSystem";
try
{
    DirectoryInfo directory = new DirectoryInfo(root);
    directory.Delete(true);
    Console.WriteLine("Каталог удален");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Про обработку исключений в C# см. здесь.

2 ответа

Лучший ответ

Чтобы проверить, существует ли файл в bash, вы используете оператор . Для каталогов используйте . Пример использования:

Для получения дополнительной информации просто выполните .

Замечание о , этот тестовый оператор проверяет, существует ли файл. Хотя это может показаться хорошим выбором, лучше использовать , который вернет false, если файл не является обычным файлом. Например, — это файл, а не обычный файл. В этом случае нежелательно, чтобы проверка вернула истину.

Примечание о переменных

Не забудьте также заключить переменные в кавычки, если у вас есть пробел или любой другой специальный символ, содержащийся в переменной, это может иметь нежелательные побочные эффекты. Поэтому, когда вы проверяете наличие файлов и каталогов, заключите файл / каталог в двойные кавычки. Что-то вроде будет работать, а следующее не удастся, если в есть пробел: .

Исправление синтаксической ошибки

У вас есть синтаксическая ошибка в операторах управления. Предложение bash имеет следующую структуру:

Или необязательно с предложением :

Вы не можете опустить предложение . Если вы хотите использовать только предложение , вы должны отрицать это условие. Результатом является следующий код:

Здесь мы добавляем восклицательный знак (), чтобы перевернуть оценку выражения. Если выражение истинно, то же выражение, которому предшествует , вернет ложь и наоборот.

13

erb
2 Фев 2018 в 11:19

Вы не можете пропустить часть then оператора if , самым простым решением было бы просто отрицать тест

Я оставил его с -e (существует), но вы можете рассмотреть возможность использования -d для каталогов или -f для файлов и некоторой обработки ошибок, чтобы отловить что-то (например, / usr / share / icons / $ j / scaleable / em> существует, но по какой-то причине является файлом, а не каталогом.) Я также заметил, что в исходном коде вы потенциально пытаетесь скопировать несколько файлов в один:

Я оставил это в своем примере на тот случай, если вы уверены, что это всегда только один файл, и намеренно переименовываете его. В противном случае я бы предложил указать только целевой каталог.

5

RSchulze
23 Июн 2015 в 00:55

# Комментарий или «обрезка строк»

Чаще всего вы используете хеш или знак числа (#), чтобы сообщить оболочке, что ниже следует комментарий, и он не должен на него воздействовать. Вы можете использовать его в сценариях оболочки и, — менее полезно, — в командной строке.

# This will be ignored by the Bash shell

Однако он не игнорируется, потому что он добавлен в историю команд.

Вы также можете использовать хеш, чтобы обрезать строковую переменную и удалить некоторый текст с начала. Эта команда создает строковую переменную с именем this_string.

В этом примере мы присваиваем текст «Dave Geek!» переменной.

this_string="Dave Geek!"

Эта команда использует echo для печати слова «How-To» в окне терминала. Он извлекает значение, хранящееся в строковой переменной, через расширение параметра . Поскольку мы добавляем хеш и текст «Dave», он обрезает эту часть строки перед тем, как передать её в echo.

echo How-To ${this_string#Dave}

Это не меняет значение, хранящееся в строковой переменной; это влияет только на то, что отправлено echo. Мы можем использовать echo для печати значения строковой переменной еще раз и проверить это:

echo $this_string

; — разделитель команд оболочки

В командной строке Вы можете вводить столько команд, сколько Вам нужно, если Вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:

ls> count.txt; wc -l count.txt; rm count.txt

Обратите внимание, что вторая команда выполняется даже в случае сбоя первой, третья — даже в случае сбоя второй и тд. Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

cd ./doesntexist && cp ~ / Documents / reports / *.
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: