Shell TAR файлы из списка или с использованием канала - PullRequest
0 голосов
/ 10 марта 2020

Я пытался передать TAR после вывода списка файлов. Сначала я попытался составить список своих файлов в соответствии с их датой. Например:

ll /home/dan/test/dir*/file* | grep 2014
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_1
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_10
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_100
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_11
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_12
...
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_97
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_98
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_99

Так как результат немного подделан, я попытался отфильтровать его.

ll /home/dan/test/dir*/file* | grep 2014 | cut -f 2- -d "/" | sed 's/home/\/home/'
/home/dan/test/dir1/file1_2014_1
/home/dan/test/dir1/file1_2014_10
/home/dan/test/dir1/file1_2014_100
/home/dan/test/dir1/file1_2014_11
/home/dan/test/dir1/file1_2014_12
...
/home/dan/test/dir4/file4_2014_97
/home/dan/test/dir4/file4_2014_98
/home/dan/test/dir4/file4_2014_99

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

Поэтому я экспортировал список в файл

ll /home/dan/test/dir*/file* | grep 2014 | cut -f 2- -d "/" | sed 's/home/\/home/' > list_files_2014.txt

Теперь мне нужно заархивировать этот список.

Но при попытке выдает ошибку:

tar -cvjf test.tar.bz2 -T list_files_2014.txt
tar: Removing leading `/' from member names
/home/dan/test/dir1/file1_2014_1
/home/dan/test/dir1/file1_2014_10
/home/dan/test/dir1/file1_2014_100
/bin/sh: 1: /home/dan/test/dir1/file1_2014_11
bzip2: not found/home/dan/test/dir1/file1_2014_12

/home/dan/test/dir1/file1_2014_13
/home/dan/test/dir1/file1_2014_14
/home/dan/test/dir1/file1_2014_15
/home/dan/test/dir1/file1_2014_16
/home/dan/test/dir1/file1_2014_17
/home/dan/test/dir1/file1_2014_18
/home/dan/test/dir1/file1_2014_19
/home/dan/test/dir1/file1_2014_2
/home/dan/test/dir1/file1_2014_20
/home/dan/test/dir1/file1_2014_21
/home/dan/test/dir1/file1_2014_22
/home/dan/test/dir1/file1_2014_23
/home/dan/test/dir1/file1_2014_24
/home/dan/test/dir1/file1_2014_25
/home/dan/test/dir1/file1_2014_26
tar: test.tar.bz2: Cannot write: Broken pipe
tar: Child returned status 127
tar: Error is not recoverable: exiting now

Кто-нибудь может мне помочь? Спасибо

1 Ответ

1 голос
/ 10 марта 2020

Вы не должны анализировать ls, потому что вывод ls не стабилен и предназначен только для чтения людьми. После обновления ОС этот вывод (его формат) может измениться, что делает ваш скрипт глючным. Предоставленная ссылка @Cyrus приводит к более исчерпывающему объяснению, которое я не хочу повторять здесь. В любом случае, для достижения ваших целей лучше использовать другие Unix инструменты, например, find.

. Но это не ваша проблема здесь.

Ваша проблема только в том, что вы tar пытается создать второй процесс сжатия, который вы выбрали. Он пытается выполнить программу под названием bzip2. Похоже, что он не установлен на вашем компьютере, поэтому он не работает. Сообщение приходит с некоторой задержкой, потому что сначала создается второй процесс, и этот параллельный запуск другого процесса затем пытается запустить программу bzip2. Тем временем процесс tar уже начал упаковывать файлы (и сделал несколько сообщений журнала). Поскольку два процесса связаны между собой каналом, первый процесс, наконец, получает SIGPIPE, когда он пытается выполнить запись в этот канал (в котором сейчас отсутствует процесс чтения).

Так что вам нужно либо установить bzip2, либо Вы просто выбираете другой алгоритм сжатия, который уже установлен. Вы можете выбрать gzip, заменив, например, параметр -j на параметр -z. Страница man tar содержит список других поддерживаемых алгоритмов сжатия.

...