쉘 스크립트를 사용하여 하위 폴더 이름이 포함된 모든 이미지 이름을 CSV 파일로 추출합니다.

쉘 스크립트를 사용하여 하위 폴더 이름이 포함된 모든 이미지 이름을 CSV 파일로 추출합니다.

하위 폴더 이름이 포함된 모든 이미지 이름을 CSV 파일로 추출하고 싶습니다.

이 폴더 구조가 있습니다

Desktop/Wall Arts Product Images/framed-posters/landscape/animals-and-birds/Bighorn/Bighorn.jpg
Desktop/Wall Arts Product Images/framed-posters/landscape/animals-and-birds/Lion/Lion.jpg
Desktop/Wall Arts Product Images/framed-posters/landscape/animals-and-birds/Giant-Panda/Giant-Panda.jpg
Desktop/Wall Arts Product Images/posters/landscape/Automobiles/Best-Deisgner-Jack-Daniel-Chopper/Best-Deisgner-Jack-Daniel-Chopper.jpg
Desktop/Wall Arts Product Images/posters/landscape/Automobiles/Ford-Mustang-Cars-Classic/Ford-Mustang-Cars-Classic.jpg
Desktop/Wall Arts Product Images/framed-posters/potrait/gods/Mukkunda/Mukkunda.jpg

더 많은 것이 있습니다.

이 명령을 실행했는데 폴더 이름 포스터와 프레임 포스터만 표시됩니다.

'ls' | sed -e 's/^/"/' -e 's/$/"/' > files.csv

원하는 출력은 -->와 유사합니다.

    Image name,category,subcategory,type

    Bighorn,landscape,animals and birds,framed-posters
    Lion,landscape,animals and birds,framed-posters
    Giant-Panda,landscape,animals and birds,framed-posters
    Best-Deisgner-Jack-Daniel-Chopper,landscape,Automobiles,posters
    Ford-Mustang-Cars-Classic,landscape,Automobiles,posters
    Mukkunda,potrait,gods,framed-posters

CSV 파일 형식으로 원하는 출력을 얻는 방법은 무엇입니까?

답변1

가능하기 때문에 sed필드 순서를 바꾸는 방법은 다음과 같습니다.

find -name "*.jpg" | sed -rn 's|^.||; s|[^/]*.jpg||; :a h; s|.*/(.*)|\1|p; x; s|(.*)/.*|\1| ; ta' | tr '\n' ',' | sed 's/,,/\n/g ; s/,$/\n/; s/^,//'

네 알겠습니다 O_O

하지만 디렉토리 구조가 일관되지 않은 경우에도 작동합니다.

여기에 더 읽기 쉽게 하기 위한 주석이 있습니다.

find -name "*.jpg" | sed -rn '{    #get the files and pipe the output to sed
s|^.||                             #remove the leading .
s|[^/]*.jpg||                      #and the basename, since each image is in a directory of the same name
:a h                               #create a label a for this branch and put the lines into the hold space in their current state
s|.*/(.*)|\1|p                     #print only the last field
x                                  #switch the hold space and pattern space 
s|(.*)/.*|\1|                      #exclude the last field from the new pattern space, which won't do anything if there is only one field on each line
ta                                 #if the last s command did anything, then start again from the label (:a) (thus recursively going through the fields and printing them out on separate lines in reverse order)
}' | tr '\n' ',' | sed '{          # finally turn the newlines into commas, then clean up the mess
s/,,/\n/g ; s/,$/\n/; s/^,//
}'

답변2

이것을 사용해 보세요:

find ~/Desktop -iname "*.jpg" -exec ls {} + | awk -F'/' ' BEGIN { OFS=", "; print "Image Name", "Category", "Subcategory", "type"} { print $(NF-1),$4, $5, $3 "" }' 

이미지 이름에서 특수 문자를 제거하려면 다음 코드를 사용하십시오.

find ~/Desktop -iname "*.jpg" -exec rename 's/[^a-zA-Z0-9.\/-]//g' {} +

출력에 따라 조정하십시오.

답변3

이 명령을 시도해 보세요..

find . | awk -F/ '{print $(NF-1)","$(NF-3)","$(NF-2)","$(NF-4)}'

답변4

일관된 디렉터리 트리 구조가 있다고 가정하면 아래에 제공된 Python 스크립트는 디렉터리 트리를 순회하고 csv 내용을 stdout 스트림으로 출력합니다( >그림과 같이 명령줄에서 연산자를 사용하여 내용을 새 파일로 출력합니다 ./dir_tree_csv.py > output_file.csv). Wall Arts Product Images디렉터리 에 배치되고 거기에서 실행됩니다.

#!/usr/bin/env python
from __future__ import print_function
import os,sys

def get_all_files(treeroot):
    file_list = []
    for dir,subdirs,files in os.walk(treeroot):
         for f in files: 
             if os.path.basename(__file__) in f: continue
             file_list.append(os.path.join(dir,f))
    return file_list

def main():
    top_dir="."
    if len(sys.argv) == 2: top_dir=sys.argv[1]
    files = get_all_files(top_dir)

    print("Image name,category,subcategory,type\n")

    for f in files:
        fields = f.split('/')
        fields.reverse()
        fields[2],fields[3] = fields[3],fields[2]
        print(",".join(fields[1:-1]))

if __name__ == '__main__' : main()

테스트 실행:

# Replicated directory structure with only two of the files for simplicity
 $ tree
.
├── dir_tree_csv.py
├── framed-posters
│   └── landscape
│       └── animals-and-birds
│           └── Bighorn
│               └── Bighorn.jpg
└── posters
    └── landscape
        └── Automobiles
            └── Best-Deisgner-Jack-Daniel-Chopper
                └── Best-Deisgner-Jack-Daniel-Chopper.jpg

8 directories, 3 files
$ ./dir_tree_csv.py                                                                                   
Image name,category,subcategory,type

Best-Deisgner-Jack-Daniel-Chopper,landscape,Automobiles,posters
Bighorn,landscape,animals-and-birds,framed-posters

관련 정보