FOR 루프가 제공하는 파일의 타임스탬프를 가져옵니다.

FOR 루프가 제공하는 파일의 타임스탬프를 가져옵니다.

내 목표는 특정 $devices에서 $files를 찾아 각 파일의 타임스탬프에 해당하는 이름을 가진 하나 이상의 폴더에 저장하는 것입니다. 타임스탬프를 얻으려면 stat를 사용하고 싶습니다.

echo "$files"와 달리 stat는 각 파일을 개별적으로 처리하지 않습니다. 대신에 ""를 사용하면 모든 파일을 한꺼번에 처리하는 것 같습니다.

인용을 개선하는 방법에 대한 제안 사항이나 내가 원하는 대로 통계를 얻는 방법에 대한 다른 팁이 있습니까? 도움을 주셔서 감사합니다.

#!/bin/bash
for devices in "$(ls /media/*/)";
  do
    for files in "$(find /media/*/$devices -iname *.jpg)";
      do
        echo "$files"   # prints all files in separate lines
        stat "$files"   # seems to process all files at once
        stat $files     # splits file paths at spaces
      done
  done

답변1

문제는 stat루프의 소스 ​​데이터가 아니라 루프의 소스 ​​데이터입니다 for. 모두 따옴표로 묶기 때문에 하나의 긴 단일 엔터티가 됩니다.

이 문제를 해결하려면 주위의 따옴표를 제거하십시오.

for files in $(find /media/*/$devices -iname "*.jpg");

모든 파일이나 경로에 공백이 없으면 작동합니다. 그러나 공백과 심지어 이상한 파일 이름(예: 따옴표나 개행 문자가 포함된 파일 이름)도 처리할 수 있는 더 우아한 솔루션이 있습니다.

while IFS= read -r -d '' file; do
    # operations on each "$file" here
done < <(find /media/*/$devices -type f -iname *.jpg -print0)

답변2

출력을 구문 분석하지 않습니다.ls. 에 의해 도입된 줄바꿈 ls과 파일 이름에 있는 줄바꿈을 구별할 수 없습니다 . 마찬가지이다 find.

for devices in $(ls /media/*/)단지 복잡하고 깨진 글쓰기 방식일 뿐입니다 for devices in /media/*/*. for files in $(find …); do …; done사용하는 대신 find … -exec ….

나중에 전체 세트를 사용하기 위해 파일을 열거하기만 하면 되므로 여기서는 두 개의 루프가 필요하지 않습니다. 귀하의 스크립트는 매우 간단합니다

find /media/*/* -iname '*.jpg' -exec stat {} +

자세한 내용은 다음을 참조하세요.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

관련 정보