Подтвердить что ты не робот

Отображать содержимое всех файлов с именами файлов с кошкой

Я не могу найти способ распечатать каждое имя файла перед его содержимым с помощью cat. Вот что я пытаюсь сделать:

[email protected]:~/Perl/t$ ls
1.txt  2.txt  3.txt
[email protected]:~/Perl/t$ echo " I am " >> 1.txt 
[email protected]:~/Perl/t$ echo " trying " >> 2.txt 
[email protected]:~/Perl/t$ echo " to do this " >> 3.txt 
[email protected]:~/Perl/t$ cat *.*
 I am 
 trying 
 to do this 
[email protected]:~/Perl/t$ 

В последней команде я получил только текст из этих файлов, но на самом деле хочу текст вместе с именами файлов. Я имею в виду, как это

Filename:1.txt 
<Data in the file>

Filename:2.txt 
<Data in that file>

Filename:3.txt
<Data in that file >
4b9b3361

Ответ 1

cat не будет печатать имена файлов. Либо получите оболочку, чтобы сделать это, либо вместо этого используйте head или tail: они печатают имя файла при передаче нескольких файлов (не совсем в том же формат). Используйте tail -n +1 для печати всего файла (начиная с строки 1, строки пронумерованы от 1).

tail -n +1 -- *.txt

Ответ 2

Это недавно обсуждалось в Hacker News через сообщение в блоге 4 unix команды, которые я злоупотребляю каждый день.

Суть его заключалась в том, чтобы использовать это:

more * | cat

Чтобы получить следующее:

::::::::::::::
jack.txt
::::::::::::::
Once upon a time
there was a fellow named Jack.
::::::::::::::
lyingryan.txt
::::::::::::::
Now that "trickle down economics" has been
tested for 30 years and the data shows it
has been a total failure, candidates
still claim that cutting taxes for
billionaires will help the economy.
::::::::::::::
market.txt
:::::::::::::::
Jack went to market to sell the family
cow.
He came back with a handful of magic beans.

Это намного симпатичнее, чем цикл for ... do ... done.

В блоге также упоминается множество альтернатив этому подходу, чтобы быть совместимыми в разных Unix, например head -n 99999 * по сравнению с head -n 0 *, который работает только с Linux.

Ответ 3

$ for f in *; do echo "Filename: $f"; cat "$f"; done
Filename: 1.txt
 I am 
Filename: 2.txt
 trying 
Filename: 3.txt
 to do this 

Ответ 4

find  . -name \*.txt -print -exec cat {} \;

Ответ 5

Вы можете достичь этого, например, с помощью

ls -1 *.txt | xargs -I % sh -c "echo % ; cat %"

просто:

  • для каждого файла .txt
  • запустите команду echo filename ; cat filename (% - это шаблон замены, определенный -I)

Ответ 6

Вы также можете чрезмерно использовать grep, чтобы достичь этого:

grep -r '.*' *.txt

Чтобы получить номера строк, вы можете

grep -rn '.*' *.txt

Выше grep просто ищет что-нибудь. Если вас не интересуют пустые строки, вы даже можете упростить:

grep -r . *txt

Кроме того, grep-переключатель -r заставит grep работать рекурсивно, поэтому вы можете

grep -r . .

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

[EDIT] Даунсайд: работает медленно, поэтому для большого количества файлов я бы не использовал его.