디렉터리에 대한 bash 한 줄짜리 루프에서 오류가 발생합니다.

디렉터리에 대한 bash 한 줄짜리 루프에서 오류가 발생합니다.

나는 현재 디렉토리 내의 디렉토리를 반복하고 디렉토리 이름을 tar 파일 이름으로 사용하여 콘텐츠를 고유한 tar로 tar하는 bash one-liner를 구축하려고 합니다. 기본 사항은 작동하지만(디렉토리 이름 찾기 및 해당 이름으로 타르링) 루프에서 일부 오류 메시지가 표시되고 실행하려는 명령을 어디서 가져오는지 이해할 수 없습니다.

다음은 주로 작동하는 단일 라이너입니다.

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

"이상한" 출력은 다음과 같습니다.

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

내가 실행 중인 명령의 어떤 부분을 이해하지 못해서 해당 출력이 생성됩니까?

답변1

명령 주위의 백틱을 제거해야 합니다 tar. bash가 모든 디렉토리를 올바르게 선택하는지 확인하기 위해 파이프를 ls통해 연결할 수도 있습니다 .xargs

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

tar백틱은 루프의 각 반복에서 출력을 캡처 하고 이를 명령으로 실행하려고 시도합니다. tar-v 옵션을 사용할 때 가장 먼저 인쇄되는 것은 각 파일(예: drwxrwxr-x)에 대한 권한입니다. 이 경우 bash를 원합니다.실행하다tar 명령은 출력을 캡처하지 않습니다.

답변2

bjlaub주변의 백틱과 관련하여 정확 tar하지만 다음을 사용할 필요는 없습니다 ls.

for file in */

트릭을 수행하고 공백이 있는 디렉토리 이름을 올바르게 처리합니다.

답변3

여기에 있는 다른 답변은 좋지만 심볼릭 링크가 아닌 디렉토리만 가져와야 하는 경우를 대비해 다른 옵션을 추가하고 싶었습니다.

for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done 

도움이 되었기를 바랍니다!

관련 정보