여러 아카이브에 저장해야 하는 일부 디렉터리에 대한 콘텐츠 파일을 만들고 싶습니다 tar
. 나는 사용한다
du --all currentdir >> contents.list
그런 이유로.
파일에 기록하기 전에 tar
출력의 각 줄에 아카이브 이름을 추가하고 싶습니다. du
나는 이것을 할 수 있다고 생각합니다 :
du --all currentdir | while read i; do echo "$i mytar" >> contents.list ; done
더 간단한 솔루션이 존재한다고 생각하지만 bash 스크립팅은 처음입니다.
답변1
이를 위해 while 루프를 사용하면 속도가 매우 느려집니다. 각 줄 끝에 정적 문자열을 추가하려면 다음을 사용하세요 sed
.
du --all | sed 's/$/ myArchive.tar/'
또는 변수에 아카이브 이름을 포함하려는 경우(예 $i
: ):
du --all | sed "s/$/ $i/"
s/old/new/
old
첫 번째 항목을 대체할 sed의 대체 연산자입니다 new
. 이 기호는 $
줄의 끝과 일치하므로 각 줄의 끝에 s/$/foo/
만 추가됩니다 .foo
답변2
일반적으로 입력 목록에서 작업을 수행하려는 경우, 특히 작업이 매우 간단한 경우 xargs
이 경우 다음과 같은 것을 선택합니다.
du --all currentdir | xargs -I{} echo "{} mytar" >> contents.list
xargs
일반적으로 성능이 매우 뛰어난 것으로 나타났으며 읽기가 더 쉽다고 생각합니다(구현마다 다를 수 있고 항상 직관적이지는 않은 다양한 정규식 표기법의 중요성을 기억할 필요가 없습니다.)
답변3
du
이를 위해 사용하는 것은 잘못된 접근 방식입니다. 대신 tar 파일이 생성되면 단순히 tar tv
내용을 나열하는 데 사용됩니다 . 예를 들어
for f in *.tar.gz; do
tar tvfz "$f" > "$f.list"
done
그러면 각 tar.gz 파일에 대해 .list 파일이 생성됩니다. 포괄적인 목록을 생성하려면 grep
다음을 사용할 수 있습니다.
grep -H . *.tar.gz.list > contents.list
패턴은 .
무엇이든 일치하며, 이 -H
옵션은 입력 파일 이름이 하나만 있는 경우에도 출력에 파일 이름과 콜론 접두사를 추가하도록 grep에 지시합니다(기본적으로 grep은 입력 파일이 여러 개인 경우에만 이 작업을 수행합니다).