シェルスクリプトを使用して、サブフォルダ名を含むすべての画像名を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/^,//
}'

おすすめ記事