我在文件夹中有一组文件,我根据文件本身移动到子文件夹中。文件格式为:
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语句?
答案 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