
나는 현재 디렉토리 내의 디렉토리를 반복하고 디렉토리 이름을 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
도움이 되었기를 바랍니다!