Чтобы показать только имя файла без полного пути к каталогу

ls /home/user/new/*.txt печатает все текстовые файлы в этом каталоге. Однако он печатает вывод следующим образом:

[me@comp]$ ls /home/user/new/*.txt
/home/user/new/file1.txt    /home/user/new/file2.txt    /home/user/new/file3.txt

и так далее.

Я хочу запустить команду ls не из каталога /home/user/new/, поэтому мне нужно указать полное имя каталога, но я хочу, чтобы вывод был только таким

[me@comp]$ ls /home/user/new/*.txt
file1.txt    file2.txt    file3.txt 

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


person Ashish    schedule 15.12.2011    source источник
comment
Какая ОС? Например, OS X уже делает то, что вы хотите. Вы уверены, что ls не является псевдонимом?   -  person Sean Owen    schedule 15.12.2011


Ответы (13)


ls whateveryouwant | xargs -n 1 basename

Это работает для вас?

В противном случае вы можете (cd /the/directory && ls) (да, скобки предназначены)

person fge    schedule 15.12.2011
comment
Вероятно, вам следует использовать ls -d в случае, если whateveryouwant относится к нескольким каталогам. - person Craig McQueen; 22.02.2016
comment
Обратите внимание, что если путь содержит пробелы, xargs сломает их. Вместо этого вам нужно использовать xargs -d '\n' -n 1. - person Zitrax; 14.03.2016
comment
Это очень медленно на Cygwin. - person Jagger; 02.10.2017
comment
Решение xargs выглядит аккуратнее, но мне оно показалось очень медленным. Я выбрал решение cd, которое работает без сбоев. - person Kar.ma; 16.03.2019
comment
использование xargs было лучшим решением в моем случае, так как я указывал весь путь при выполнении ls, поэтому ls -1 в моем случае не работал - person Vishrant; 19.03.2019

Нет необходимости в Xargs и прочем, ls более чем достаточно.

ls -1 *.txt

отображает построчно

person VRVigneshwara    schedule 05.09.2015
comment
Это неверно, если вы внимательно читаете ОП. Это работает, только если вы находитесь в этом каталоге. - person Barney Szabolcs; 29.08.2016
comment
Работает отлично! Спасибо @VRVigneshwara! ls -1 bin/ список записей внутри каталога bin/ без пути в Linux Debian. - person Zeke Fast; 22.11.2017
comment
Это вызовет проблемы с множеством (и большим количеством) файлов, а также каталогов, оканчивающихся на .txt, и требует подстановка, чтобы быть активным в вашей оболочке. - person ckujau; 29.03.2020

Есть несколько способов добиться этого. Можно было бы что-то вроде:

for filepath in /path/to/dir/*
do
    filename=$(basename $filepath)

    ... whatever you want to do with the file here
done
person pgl    schedule 15.12.2011

Используйте команду basename:

basename /home/user/new/*.txt
person Dwayne    schedule 11.02.2020

(cd dir && ls)

будут выводить имена файлов только в dir. Используйте ls -1, если вы хотите по одному на строку.

(Изменено; на && согласно комментарию Sactiw).

person mrpraline    schedule 08.06.2017
comment
С использованием ';' вместо «&&» для цепочки команд в этом случае будет ошибка, поскольку он вернет некоторый вывод в случае несуществующего «dir», а также список файлов из текущего рабочего каталога, из которого вы выполняете эту команду. Например. (cd fake_dir ; ls) выведет список файлов из текущего каталога, даже если такой fake_dir не существует, что было бы неверно. - person sactiw; 25.06.2019

Причудливый способ решить эту проблему - дважды использовать "rev" и "cut":

find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev
person John Rumpel    schedule 12.11.2014

вы можете добавить скрипт sed в свою командную строку:

ls /home/user/new/*.txt | sed -r 's/^.+\///'
person zuloo    schedule 15.12.2011

Я предпочитаю базовое имя, на которое уже отвечает fge. Другой способ:

ls /home/user/new/*.txt|awk -F"/" '{print $NF}'

еще один уродливый способ:

ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1
person Vijay    schedule 15.12.2011

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

ls /path/to/my/directory | xargs -n1 -I{} basename "{}"

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

person Addison    schedule 22.07.2019

просто надеюсь быть полезным для кого-то, поскольку старые проблемы, кажется, возвращаются время от времени, и я всегда нахожу здесь хорошие советы.

Моя проблема заключалась в том, чтобы перечислить в текстовом файле все имена файлов «*.txt» в определенном каталоге без пути и без расширения из последовательности Datastage 7.5.

Решение, которое мы использовали:

ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt
person Mauri    schedule 29.03.2017
comment
basename также может удалить суффикс (вы указываете удаляемый суффикс в качестве второго аргумента). ваша команда будет выглядеть так: ls /home/user/new/*.txt | xargs -n 1 -J % basename % .txt - person welch; 05.02.2019

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

ls /home/user/new | tr '\n' '\n' | grep .txt

Другой метод:

cd /home/user/new && ls *.txt
person Chaminda Bandara    schedule 14.06.2019

Когда вы хотите перечислить имена в пути, но они имеют разные расширения файлов.

me@server:/var/backups$ ls -1 *.zip && ls -1 *.gz

person JKE    schedule 08.02.2021

Вот еще один способ:

ls -1 /home/user/new/*.txt|rev|cut -d'/' -f1|rev
person Rafael Marques    schedule 28.05.2021