Я нахожусь в сценарии bash, и я хочу получить список всех файлов (скажем, все файлы JAR). Я выполняю команду ls -1 lib/*.jar
и получаю вывод:
lib/mylib_1.jar
lib/mylib_2.jar
...
Есть ли возможность иметь следующий вывод:
mylib_1.jar
mylib_2.jar
...
Создание cd lib
до не является вариантом, так как я нахожусь в цикле и должен быть в родительской папке для действий, которые я хочу сделать внутри цикла.
Я пытался найти информацию, набрав, man ls
но я не нашел никакого решения.
Решение с другой командой было бы хорошо, если бы я мог передать его своей ls
команде или самодостаточно.
Ответы:
Вместо разбора ls вы должны использовать
find
вместо этого. Затем вы также можете выполнитьbasename
для каждого файла, чтобы удалить ведущие каталоги:источник
-maxdepth
Вариант.В GNU
find
нет необходимости запускатьbasename
каждый файл, это будет намного быстрее (особенно, если файлов много):источник
Как насчет того
(cd lib && echo *.jar)
, чтобы в именах файлов не было пробелов или специальных символов? Родительский скрипт никогда не меняет каталог.источник
printf '%s\n' *.jar
чтобы каждый файл в отдельной строке, хотя.printf '%s\0' *.jar
для устранения проблем с пробелами (хотя это не вопрос).Как сказал Джош Джолли в своем ответе, вы никогда не должны анализировать
ls
, вместо этого используйте подход в своем ответе. Тем не менее, вотawk
решение для удаления путей из имен файлов, просто не используйте его с ls:В
-F'/'
наборах разделитель поля/
означает , что последнее поле,$NF
будет иметь имя файла.источник
find
это, вероятно, путь, но если вы действительно, действительно (не хотите) отказатьсяlib/
отls -1
, вы можете использоватьsed
:источник
Вы можете сделать это, используя xargs с параметром --max-args (или более коротким псевдонимом -n):
ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename
Обратите внимание, что мы используем,
--quoting-style=c
чтобы убедиться, что пробелы в именах файлов не портят xargs.источник
Альтернативный способ решить ваш запрос - перечислить все файлы, используя
ls -R
. Объедините вывод команды ls с grep, чтобы получить список только файлов .jar. Вы можете использовать следующую команду, чтобы сделать то же самое для вашего запроса:источник
mylib_2.jar
и отфильтровать файлы какlist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> нет вывода вообще.