내 목표는 특정 $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 {} +
자세한 내용은 다음을 참조하세요.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?