Как перечислить * .tar.gz, одно имя файла в строке?

8

Я пытаюсь перечислить каждый .tar.gzфайл, используя только следующую команду:

ls *.tar.gz -l

... Это показывает мне следующий список:

-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file1.tar.gz
-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file2.tar.gz

Однако мне просто нужно перечислить это так:

file1.tar.gz 
file2.tar.gz

а также нет:

file1.tar.gz file2.tar.gz

Как это «правильно» сделать?

McLan
источник
6
Это хорошая привычка использовать опции перед именами файлов. и вам нужно использовать -1 вместо -l
AnonymousLurker
17
ls -1 *.tar.gz, Но то , что вы хотите использовать этот список для ? Если вы делаете что-то с этими именами файлов, то lsэто неправильный способ сделать это. Посмотрите, почему * не * анализирует `ls` (и что вместо этого нужно сделать)?
Кусалананда
3
руководство вам нужно man ls. Убедитесь, что ваш отображаемый шрифт имеет хороший контраст между 1 (один) и l (строчная буква ell).
ctrl-alt-delor

Ответы:

39

-1Вариант (цифра «один», а не нижнему регистру «L») перечислит один файл в каждой строке, без другой информации:

ls -1 -- *.tar.gz
Стивен Китт
источник
1
Почему двойные черточки? ls -1 *.tar.gzработает так же хорошо.
RonJohn
8
@RonJohn позволяет избежать неожиданностей с именами файлов, начинающимися с -.
Стивен Китт
5
В частности ... Скажем , я был взломщик, и имел следующие файлы: .hiddenfile, benign.php, evil.bin, --hide=*evil*; без --вы не увидите evil.bin или --hide=*evil* .
wizzwizz4
Я совершенно разочарован, что нет -2(или -3 и т. Д.)! ;-)
Питер - Восстановить Монику
1
(... что заставило меня посмотреть вверх columns!)
Питер - Восстановить Монику
19

Если вам нужны только имена файлов, вы можете использовать printf:

printf '%s\n' *.tar.gz

... оболочка расширит *.tar.gzподстановочный знак до имени файла, затем printfнапечатает их, за каждым последует новая строка. Этот результат будет немного отличаться от уls в случае имена файлов с символами новой строки , встроенные в них:

настроить

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz

Ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz

Printf

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz
Джефф Шаллер
источник
6
Смотрите также ls -b, ls -QЛ.С. --quoting-style=....
Стивен Китт
И printf '%q\n'. (Оба GNU.)
dave_thompson_085
9

lsведет себя по-разному, когда его вывод передается по конвейеру. Например:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command

Поэтому, если вы хотите увидеть все свои *.tar.gzфайлы, по одному в строке, вы можете сделать это:

ls *.tar.gz | cat

Но что, если вы не хотите передавать результаты? То есть есть ли способ принудительно lsвывести имена файлов по одному в строку, не передавая вывод?

Да, с -1выключателем. (Это тире с номером 1.) Таким образом, вы можете использовать эти команды:

ls -1             # shows all (non-hidden) files, one per line
ls -1 *.tar.gz    # shows only *.tar.gz files, one per line
JL
источник
7

Или с GNU find:

find  -name "*.tar.gz"  -printf '%P\n'

В противоположность lsс *ним будет искать .tar.gzфайлы рекурсивно:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz
Аркадиуш Драбчик
источник
Почему, -printf '%P\n'а не просто -print- в этот момент findбудет работать любой совместимый с Posix .
Мартин Боннер поддерживает Монику
@MartinBonner, потому -printчто добавит ./перед именем файла.
Аркадиуш Драбчик
4

Чуть более окольным и петлевым способом:

for i in *.tar.gz; do
    echo "$i"
done

РЕДАКТИРОВАТЬ: добавлены кавычки для обработки странных имен файлов

snetch
источник
5
touch -- '-e \a.tar.gz'по причине, чтобы процитировать ваши переменные и unix.stackexchange.com/q/65803/117549 по причинам, чтобы использовать printf вместо echo
Джефф Шаллер
oof, я просто потратил 5 минут, пытаясь выяснить, как удалить полученный -e \a.tar.gzфайл
snetch
3
Извините! rm -- '-e \a.tar.gz'должен сделать трюк
Джефф Шаллер
Ты хороший, это был урок, и я узнал, что это --работает для rmмногих других.
snetch
@JeffSchaller: другое решение для локальных именrm_etc './-x blah'
dave_thompson_085