2016-07-12 2 views
0

В моей Баш скрипт я должен проверить содержимое папки, но его путь можно изменить с помощью дерева разные «окончаний»печати папки с переменной пути в BASH

изначально моя папка:

/home/myuser/my_folder 

Затем пользователь может изменить название моей папки с дерева possibile окончаний

/home/myuser/my_folder_aaaa 
/home/myuser/my_folder_bbbb 
/home/myuser/my_folder_cccc 

Таким образом, пользователь может добавить "_aaaa" или "_bbbb" "_cccc"

Эти суффиксы известны.

В моем сценарии bash, как я могу проверить содержимое «ls» в моей папке и в случае, если кто-то изменит имя? NB: мне нужно проверить только эту папку, так что если есть папка под названием «/ главная/MyUser/my_folder_ssss» не должны соответствовать и содержание не должно отображаться

ответ

0

Кажется, что вам нужно что-то вроде этого:

ls -1 | egrep "^my_folder(|_aaaa|_bbbb|_cccc)$" 

Эта команда печатает имя указанной папки, если оно существует.

ls -1 печатает все наименования предметов внутри каталога по одному в строке.

egrep проверяет, является ли имя элемента спички к my_folder или my_folder_aaaa, my_folder_bbbb, my_folder_cccc.

Тогда вы можете делать все, что хотите, с этим именем. Например, вы можете проверить содержимое с:

ls -l `ls -1 | egrep "^my_folder(|_aaaa|_bbbb|_cccc)$"` 
+0

как я могу получить текущий полный путь? так как я не знаю, как это сделано, как я могу «сохранить» в переменной полный новый путь (например,/home/myuser/my_folder_bbbb)? Я попытался вставить команду «pwd», но ничего .. – user3472065

+0

@ user3472065 Пожалуйста, проверьте это: http: // superuser.com/questions/202645/how-to-get-the-full-path-of-a-file-in-bash –

+0

Пожалуйста, смотрите: [Почему вы не должны анализировать вывод ls (1)] (http://mywiki.wooledge.org/ParsingLs) – andlrc

1

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

ls -d /home/myuser/my_folder/* /home/myuser/my_folder/.* /home/myuser/my_folder_aaaa/* /home/myuser/my_folder_aaaa/.* /home/myuser/my_folder_bbbb/* /home/myuser/my_folder_bbbb/.* /home/myuser/my_folder_cccc/* /home/myuser/my_folder_cccc/.* 2>/dev/null 

-d: не указывайте содержимое каталога.

2>/dev/null: стандартная ошибка перенаправления на /dev/null; ls Сообщения об ошибках о несуществующих каталогах не отображаются.

Отметьте, что find является предпочтительным в сценариях.

+0

Вы также можете использовать 'setopt -s nullglob' для расширения несовпадающих глобусов до нуля. – andlrc

2

Вы можете использовать регулярные выражения предиката в найти и выполнить Ls, если регулярное выражение соответствует:

find /home/myuser/ -regex ".*/my_folder\(_aaaa\|_bbbb\|_cccc\)$" -exec ls "{}" ";" 
+0

Можно также использовать более подробный подход, который описывается в POSIX find: 'find/home/myuser/\ (-name 'my_folder_aaaa' -o -name 'my_folder_bbbb' ... \) -exec ...' – andlrc

0

Ниже будет ls -l папки, которые соответствуют шаблону в описании

ls /home/myuser/my_folder_* | grep "aaaa\|bbbb\|cccc" | while read x; do ls -l ${x:0:-1}; done 
+0

Пожалуйста см.: [Почему вы не должны анализировать вывод ls (1)] (http://mywiki.wooledge.org/ParsingLs) – andlrc

+1

Yup! Разбор 'ls' выглядит как плохая идея. Спасибо. – ViKiG

Смежные вопросы