.txt 파일의 부분 패턴을 기반으로 특정 파일을 다른 폴더로 이동합니다.

.txt 파일의 부분 패턴을 기반으로 특정 파일을 다른 폴더로 이동합니다.

다양한 파일 형식의 폴더가 있지만 .img다음 패턴을 사용하여 확장자가 . 인 파일에 관심이 있습니다.

ppi_noTD_d0_P_76con_0001.img
ppi_noTD_d0_P_104con_0001.img
ppi_noTD_d0_P_150con_0001.img
ppi_noTD_d0_P_201con_0001.img
etc. 

변경되는 파일 이름의 유일한 부분은 P_XXX부분입니다.

두 개의 .txt 파일을 만들었고 각 파일 stable.txt에는 하위 집합을 별도의 폴더로 이동하는 데 사용할 recurring.txt하위 집합 목록이 포함되어 있습니다 (P_XXX안정적인그리고또 그런 일이 일어났어, 각각). 예를 들어, P_76P_201는 다음에 나열되어 있습니다.안정.txt, 동시에 P_104P_154목록에 표시됩니다.반복.txt.

for loop.txt 파일에서 관련 콘텐츠를 반환하여 P_XXX폴더의 .img다른 파일 for loop에서 일치 항목을 검색한 다음 다음 위치로 옮기려고 합니다.안정적인폴더:

for P in $(< stable.txt); do
     for f in *"$P"*.img; do
         echo mv - "$f" "./stable/$f"
     done
done 

나열된 올바른 숫자를 반환 P_XXX하지만 $f전체 파일 이름은 반환하지 않습니다(비트만 반환 *P_XXX). 이상하게 도 P_XXX마지막 .txt 파일의 전체 파일 이름을 반환합니다.ppi_noTD_d0_P_201_con_0001.img

통화에 문제가 있는 것 같아서 $f파일을 해당 폴더로 이동할 수 없습니다(안정적인그리고또 그런 일이 일어났어).

이 문제를 어떻게 해결할 수 있나요?


편집하다:

이것은 내가 얻는 결과입니다.

*.img ./stable/*P_76
*.img ./stable/*P_86
*.img ./stable/*P_89
*.img ./stable/*P_90
*.img ./stable/*P_91
*.img ./stable/*P_99
*.img ./stable/*P_121
*.img ./stable/*P_128
*.img ./stable/*P_132
*.img ./stable/*P_136
*.img ./stable/*P_140
*.img ./stable/*P_144
*.img ./stable/*P_153
*.img ./stable/*P_156
*.img ./stable/*P_162
*.img ./stable/*P_180
*.img ./stable/*P_203
*.img ./stable/*P_205
*.img ./stable/*P_208
*.img ./stable/*P_211
*.img ./stable/*P_215
*.img ./stable/*P_229
*.img ./stable/*P_250
*.img ./stable/*P_256
mv - ppi_noTD_d0_P_257con_0001.img ./stable/ppi_noTD_d0_P_257con_0001.img

답변1

파일 stable.txt이 Windows 시스템에서 생성되거나 편집되었을 수 있습니다.새로운 팀캐리지 리턴 + 개행 시퀀스로 표시됩니다(종종 CR LF약어 또는 이스케이프 시퀀스를 사용하여 인용됨 \r\n).

예를 들어 다음 샘플 파일을 가정해 보겠습니다.

printf '%s\r\n' P_76 P_201 >stable.txt

스크립트가 첫 번째 줄을 읽은 후 와일드카드 표현식은 *"$P"*.img파일 이름에 실제로 캐리지 리턴이 포함되어 있지 않은 한 아무것도 일치하지 않으며, nullglob유효한 옵션이 없거나 이에 상응하는 옵션이 없는 경우 f값은 *P_76\r*.img. 에코 되면 mv - "$f" "./stable/$f"이 두 CR문자로 인해 후속 텍스트가 줄 시작 부분에 삽입되어 기존 텍스트를 덮어씁니다.

다음을 사용하여 파일의 CR LF개행 순서를 확인할 수 있습니다.

$ cat -v stable.txt
P_76^M
P_201^M

또는

$ od -An -c stable.txt
   P   _   7   6  \r  \n   P   _   2   0   1  \r  \n

또는

$ file stable.txt
stable.txt: ASCII text, with CRLF line terminators

다음 방법을 사용하여 Unix, LF 종료 형식으로 변환할 수 있습니다.

$ dos2unix stable.txt

또한보십시오:

관련 정보