Отображать содержимое всех файлов с именами файлов с кошкой
Я не могу найти способ распечатать каждое имя файла перед его содержимым с помощью 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 >
Ответы
Ответ 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]
Даунсайд: работает медленно, поэтому для большого количества файлов я бы не использовал его.