한 디렉토리에 여러 개의 파일이 있는데 형식이 다른 파일은 거의 없습니다. 지정된 형식이 있는 것과 그렇지 않은 것을 구분하고 싶습니다. 500개가 넘는 파일이 있어서 수동으로 수행하는 데 시간이 많이 걸리므로 어떤 형태의 bash 접근 방식이 가장 좋을 것이라고 생각합니다.
디렉토리 예,
hello.txt
example.txt
world.txt
...
필수 형식의 예,
Hello \t World \t Hi
내가 원하는 것은 원하는 형식의 파일을 별도의 폴더로 이동 및/또는 복사하는 것입니다.
조건부 방법은 다음과 같습니다.
awk -F"\t" {' $1 ~ "[a-zA-Z] && $2 ~ "[a-zA-Z]" && $3 ~ "[a-zA-Z]" && NF < 5}
그래서 이 접근법에서는
$1 contains alpha
$2 contains alpha
$3 contains alpha
and the number of delimiters are below 5 ( incase )
이는 최소한의 조정으로 단일 파일에 대해 작동하지만 디렉터리의 모든 파일을 처리하고 각 파일 검사에 대한 각 줄의 처리 속도를 늦추려면 검사가 라인 1 또는 2 라인 이상으로 설정될 수 있습니다.
답변1
GNU를 사용하면 awk
다음 mv
과 같은 작업을 수행할 수 있습니다.
gawk -F'\t' -v ORS='\0' '
NF < 5 && $1 ~ /[[:alpha:]]/ && $2 ~ /[[:alpha:]]/ && $3 ~ /[[:alpha:]]/ {
print FILENAME; nextfile
}' ./*.txt | xargs -r0 mv -t destination-directory
destination-directory
이름이 다음으로 끝나고 .txt
5개 미만의 필드(구분 기호 4개 미만)가 있는 최소 한 줄을 포함하고 처음 3개 필드에 최소 하나의 알파벳 문자가 포함된 (숨겨지지 않은) 파일 로 이동됩니다 .
grep
이는 다음을 사용하여 GNU를 통해 수행할 수도 있습니다 mv
.
grep -lZxP '([^\t]*[[:alpha:]][^\t]*)\t(?1)\t(?1)(\t[^\t]*)?' ./*.txt |
xargs -r0 mv -t destination-directory