폴더의 여러 텍스트 파일에 대해 명령을 실행하기 위해 for 루프를 실행하는 쉘 스크립트가 있습니다. 이러한 파일의 이름이 특정 문자 집합(예: NA)으로 시작하는지, 파일에 특수 문자가 없는지(예: "-", "_"와 같이 파일 확장자 앞에 마침표가 없는 경우 제외) 테스트하고 싶습니다. 파일의 전체 이름을 테스트하는 방법을 알고 있지만 파일의 일부에 이러한 문자가 포함되어 있는지 테스트하는 방법이나 문자와 숫자만 포함되고 ". " ".txt"에서. 이러한 요구 사항을 충족하는 파일에서만 명령이 실행되도록 하려면 어떻게 해야 합니까? 나는 그것이 if 문을 사용한다는 것을 알고 있지만 그 이상은 확실하지 않습니다. 와일드카드나 정규식을 사용하는 경우인 것 같습니다.
답변1
아래 코드를 사용하면 "NA"로 시작하고 영숫자만 포함하며 ".txt"로 끝나는 텍스트 파일에 대해 특정 작업을 수행할 수 있습니다.
for f in /path/to/your/folder/*; do
if [[ ${f##*/} =~ NA[a-zA-Z0-9]*.txt ]]; then
# perform some action on $f
fi
done
파일이 "N" 또는 "A"로 시작하도록 하려면 다음 명령을 사용하십시오.
for f in /path/to/your/folder/*; do
if [[ ${f##*/} =~ [N,A][a-zA-Z0-9]*.txt ]]; then
# perform some action on $f
fi
done
답변2
빠른 해킹은 다음과 같습니다.
#!/bin/bash
for i in *;
do
if [ $(echo $i|cut -c 1-2) == "NA" ];
then
EXECUTE_COMMAND
fi
done
귀하의 질문을 올바르게 이해하고 있습니까?
답변3
쉘이 이를 지원하는 경우 확장된 와일드카드를 사용할 수 있습니다.
세게 때리다:
shopt -s extglob
for f in NA*([[:alnum:]]).txt; do something; done
다루기 힘든:
setopt extendedglob
for f in NA([[:alnum:]])#.txt; do something; done
여기서 *(...)
및 는 (...)#
각각 0개 이상의 발생을 나타냅니다.
답변4
egrep은 다음을 수행해야 합니다:
egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'
따라서 ls /path/to/dir | egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'
다음과 같이 나열됩니다.
NAfoo.txt
NAbar1.jpeg
NA123baz.txt
그러나 다음은 제외됩니다.
aiNA1foo.txt
NA2foo_bar.jpeg
NAbar.baz.txt
등.