1

givenFolder にはサブフォルダーがあります。各サブフォルダーには、次のパターンの 36 個のファイルが必要です<subfoldername>_<xx>.png(例: abc_09.png、abc_10.png など)。36 個のファイル (01 から 36) のいずれかが見つからない場合は、1x1.png をそのファイルとしてコピーして、そのフォルダーに作成します。たとえば、abc_01.png が見つからない場合は、1x1.png を abc_01.png としてそのサブフォルダーにコピーし、最後に各サブフォルダーに 36 個の番号付きファイルをすべて含めるようにします。1x1.png のハードコーディングされた場所を想定します。

これまでのところ、私はこれを行うことができます:

#!/bin/bash

#list all sub directories and files under it
if [ ! -z "$1" ] 
  then
    echo "Arguments passed";
    if [ -d "$1" ]
    then    
        tree -if --noreport "$1";
    else        
        echo "Supplied argument is not a directory";
    fi
else
    echo "No arguments passed";
fi

しかし、私は前に進む方法がわかりません。

4

2 に答える 2

4
DEFAULT_PNG='/path/to/your/1x1.png'

if [[ $1 ]]; then
    echo "Arguments passed";

    if [[ -d $1 ]]; then    

        for curFile in "$1/"abc_{01..36}.png; do
            if ! [[ -f $curFile ]]; then
                cp -- "$DEFAULT_PNG" "$curFile"
            fi
        done

    else        
        echo 'Supplied argument is not a directory';
    fi
else
    echo 'No arguments passed';
fi

bash ブレース展開について読む

あなたが質問を編集した後、私はあなたが何か違うものを望んでいることを理解し始めました.

DEFAULT_PNG='/path/to/your/1x1.png'

if [[ $1 ]]; then
    echo "Arguments passed";
    if [[ -d $1 ]]; then

        for curSubdir in "$1/"*; do 
            if [[ -d $curSubdir ]]; then #skip regular files
                dirBasename=$(basename -- "$curSubdir")
                for curFile in "$curSubdir/$dirBasename"_{01..36}.png; do
                    if ! [[ -f $curFile ]]; then
                        cp -- "$DEFAULT_PNG" "$curFile"
                    fi
                done

            fi
        done

    else        
        echo 'Supplied argument is not a directory'
    fi
else
    echo 'No arguments passed'
fi
于 2013-08-30T13:08:02.123 に答える
1

良い答えがすでに受け入れられていることは知っていますが、質問を最初に読んだとき、givenFolder のサブフォルダーがより任意の深さまで拡張される可能性があり、スクリプトへの直接の引数 (「givenFolder」) PNG ファイルが取り込まれませんでした。それで、これがどのように見えるかです。

そして、bash の気の利いたブレース展開を使用することを思い出させてくれた @Aleks-Daniel に敬意を表します。

#!/bin/bash

[ $# -ge 1 ] || exit 0

DEF_PNG='/tmp/1x1.png'

[ -f "$DEF_PNG" ] || ppmmake black 1 1 | pnmtopng > "$DEF_PNG" || exit 1

function handle_subdir() {
  [ -d "$1" ] || return

  local base=$(basename "$1")
  local png

  for png in "$1"/"$base"_{01..36}.png; do
    [ -e "$png" ] || cp "$DEF_PNG" "$png"
  done
}

# Only process subdirectories of the directory arguments to
# the script, but do so to an arbitray depth.
#
find "$@" -type d -mindepth 1 | while read dir; do handle_subdir "$dir"; done

exit $?

サブフォルダーが対戦相手によって作成され、\n 文字が含まれている場合、find 出力を bash の read コマンドにパイプすると、不適切な動作が発生します。ただし、簡単なテストでは、フォルダー/ディレクトリ名の他の特殊文字 (空白、$、* など) を適切に処理することが示されました。

于 2013-08-30T15:54:04.437 に答える