2017-11-08 6 views
1

ファイルには、ファイル自体に基づいてサブフォルダに移動するフォルダがあります。ファイル形式は次のとおりです。例外のあるフォルダにファイルを移動する

名/ FILE.EXT:私は成功した構造をフォルダに変換することができた

for i in `ls | grep _`; do 
    mkdir -p `echo $i | cut -f1 -d "_"` 
    mv $i `echo $i | cut -f1 -d "_"`/`echo $i | cut -f5 -d "_"` 
    mv $i `echo $i | cut -f1 -d "_"`/`echo $i | cut -f4 -d "_"` 
done 

:このコード行を利用

Name_metadata_metadata_File.ext

私はファイル(Name_str_metadata_metadata_File.ext)に余分な文字列を持つファイルをいくつか持っており、それらを削除したいと考えています。私は、コード行にif文を追加する問題に取り組んでいます。

for i in `ls | grep _`; do 
    mkdir -p `echo $i | cut -f1 -d "_"` 
    if `echo $i | cut -f2 -d "_"` == "str"; then 
     mv $i `echo $i | cut -f1 -d "_"`/`echo $i | cut -f5 -d "_"` 
    else 
     mv $i `echo $i | cut -f1 -d "_"`/`echo $i | cut -f4 -d "_"` 
    fi 
done 

私はif文を間違って記述していますか?

+0

1行に入れる必要がありますか?さらに、lsの出力に頼るべきではありません –

答えて

3

lsの出力を意識的に解析しないでください(BashFAQ - Why you shouldn't parse the output of ls(1)を参照)。これは、さまざまな方法で間違っている可能性があります。ビルトイングロブ拡張を使用するシェル内に支持

for file in *_*; do 
    [ -f "$file" ] || continue 
    mkdir -p "${file%%_*}" || { printf 'error creating dir\n' >&2; exit 1; } 
    mv "$file" "${file%%_*}/${file##*_}" 
done 

"${file%%_*}${file##*_}"は、この場合_で区切り、与えられた単語から最も早いおよび最も遠い列を抽出するためのパラメータ展開のsynticesあります。 Bash - Parameter expansion - substring removal

関連する問題