将文件移动到具有异常的文件夹中

时间:2017-11-08 14:00:22

标签: bash shell

我在文件夹中有一组文件,我根据文件本身移动到子文件夹中。文件格式为:

Name_metadata_metadata_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

我已成功将其转换为文件夹结构:

名称/ 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语句?

1 个答案:

答案 0 :(得分:3)

不要有意识地解析ls的输出,请参阅BashFAQ - Why you shouldn't parse the output of ls(1),它可能会在很多方面出错。使用shell中支持的内置glob扩展

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##*_}"是参数扩展合成,用于从给定分隔符的单词中提取最早和最远的字符串,在本例中为_。见Bash - Parameter expansion - substring removal