확장자가없는 파일을 tar하는 방법은 무엇입니까?


0

다양한 파일과 하위 디렉토리가있는 디렉토리가 있습니다. 확장자가없는 모든 파일을 tar편집 해야합니다 . 이름이 변경되어 하드 코딩 할 수 없습니다. 서브 디렉토리에는 관련이 없으며 아카이브에 포함되어서는 안되는 지정되지 않은 수의 파일 및 서브 디렉토리도 포함될 수 있습니다.

.sh스크립트를 사용하지 않고 한 줄 로이 작업을 수행 할 수 있기를 원 하므로이 프로세스를 최대한 이식 가능하게 재현 할 수 있습니다.


샘플 디렉토리 구조 :

$ ls -1F

bar-dir/
bar.with.dots
foo-directory/
foo-no-ext
quux.dir/
quux.ext

결과 tarfoo-no-ext이 경우 에만 포함해야합니다 .


내가 지금까지 생각해 본 가장 가까운 것은

tar -cf archive.tar --exclude=*.* --no-recursion *

그러나 샘플 세트에서 실행될 때 archive.tar여전히 하위 디렉토리 (비어 있음에도 불구하고)가 포함됩니다.

$ tar -tf archive.tar

bar-dir/
foo-directory/
foo-no-ext

1
쉘 스크립트를 사용하는 것이 생각 보다 이식성이 좋습니다. 예를 들어, bash또는 perl모든 시스템에서 정확히 동일하지만 tarGNU, BSD, Solaris tar 일 수 있습니다.
grawity

답변:


3

이 명령은 원하는 것을 수행합니다.

 find * -maxdepth 0 -type f | tar -cf archive.tar --exclude=*.* -T -

find명령은 *현재 디렉토리에서만 파일 인 모든 디렉토리 -maxdepth 0를 찾습니다 -type f(디렉토리, 장치 또는 기타 특수 파일은 아님). 결과 파일은 점을 포함하는 이름을 제외하는 tar로 전달됩니다.


공백이있는 파일 이름은 허용되지 않습니다. find ... | tar -T - ...다소 나아질 것입니다.
grawity

@grawity 제안한대로 편집하여 공백이있는 파일 이름을 허용합니다.
juggler

-type f링크, 소켓, 파이프 및 장치 노드를 찾지 않으려면 제안하십시오 .
matthias krull

@ mugen 나는 당신의 제안을 받아 명령을 편집했습니다.
juggler

1

어때요?

tar -cf archive.tar `ls|grep "^[^.]*$"`

쉘을 많이 기대하지는 않지만 grep이 있다고 가정합니다 (필자는없는 시스템을 본 적이 없습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.