나는 최소한 다음 필드를 포함하는 한 줄의 디렉토리에 있는 각 파일을 가져오려고 합니다(순서는 중요하지 않지만 순서는 더 좋습니다).
- Image resolution, in case it is an image. If not, just blank.
- Modification date
- Human readable file size
- Filename
디렉토리의 파일은 jpg 이미지이고 나머지는 일반 텍스트 파일입니다. 나는 비슷한 것을 시도했습니다 :
find . -type f -exec paste `identify {} 2> /dev/null` `ls -goh {}` \;
ls
말해 주세요 cannot access {}
. 2> /dev/null
내부 부분은 identify
jpg가 아닌 파일에 대한 오류 메시지를 건너뛰는 데 사용됩니다.
xargs
나는 또한 다른 조합 등을 시도했지만 $()
아직 방법을 찾지 못했습니다.
어떤 제안이 있으십니까?
답변1
-exec
이는 포함된 스크립트에 유용하게 사용되는 것 같습니다 .
find . -name \*.png -exec sh -c 'printf '%s,%s\\\\n' "$(identify -format '%hx%w' "$1")" "$(stat -c %y,%s,%n "$1")";' bash {} \; > out.csv
예시 출력은 다음과 같습니다:
32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png
20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png
가독성을 위해 스크립트는 다음과 같이 분류됩니다.
find . -name \*.png -exec sh -c
'printf '%s,%s\\\\n'
"$(identify -format '%hx%w' "$1")"
"$(stat -c %y,%s,%n "$1")";'
bash {} \; > out.csv
개별 내용을 넣으려면 추가 따옴표를 참고 \n
하세요 printf
.
Outside find
, 현재 디렉터리에 있는 파일에 대해 이러한 종류의 출력을 얻으려면 다음을 수행하세요.
for f in ./*.png
do
printf '%s,%s\n' "$(identify -format '%hx%w' "$f")" "$(stat -c %y,%s,%n "$f")"
done
예시 출력은 다음과 같습니다:
20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png
32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png
세 번째 명령의 경우 필요에 따라 이러한 부분을 교체하거나 다른 부분을 추가할 수 있습니다. 다른 %s
참조 명령을 추가하기만 하면 됩니다.
간단한 CSV 형식 출력을 생성했지만 파일 이름에 쉼표가 포함될 수 있는 경우 파일 이름을 인용해야 합니다. 파일 크기를 단순 바이트 문자열에서 수천 비트 단위의 쉼표가 있는 문자열로 변환하는 경우에도 마찬가지입니다.
답변2
대체 텍스트는 검색이 시작되기 전에 한 번 평가됩니다. 현재 선호되는 방법은 입니다 $( )
. 인용된 명령을 셸에 전달할 수 있지만 가장 쉬운 방법은 스크립트를 생성하고 find
.