du 또는 ls -l과 같이 여러 줄을 반환하는 bash 명령의 각 줄에 문자열을 추가하는 방법

du 또는 ls -l과 같이 여러 줄을 반환하는 bash 명령의 각 줄에 문자열을 추가하는 방법

여러 아카이브에 저장해야 하는 일부 디렉터리에 대한 콘텐츠 파일을 만들고 싶습니다 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은 입력 파일이 여러 개인 경우에만 이 작업을 수행합니다).

관련 정보