찾기+붙여넣기+찾기: 파일당 여러 쿼리

찾기+붙여넣기+찾기: 파일당 여러 쿼리

나는 최소한 다음 필드를 포함하는 한 줄의 디렉토리에 있는 각 파일을 가져오려고 합니다(순서는 중요하지 않지만 순서는 더 좋습니다).

 - 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내부 부분은 identifyjpg가 아닌 파일에 대한 오류 메시지를 건너뛰는 데 사용됩니다.

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.

관련 정보