将文件移动到单独的子文件夹中

时间:2016-09-16 02:18:09

标签: bash shell unix

我一直在努力编写一个shell脚本,我只是难倒了。我在Mac上并且对使用UNIX有一些了解,但我很难过。我有一个文件列表:

folder1_123
folder1_abc
folder2_654
folder2_zxy

我希望他们是这样的:

folder1/123
folder1/abc
folder2/654
folder2/zxy

到目前为止,我已经得到了一个如下所示的脚本:

for file in *_.*; do
dir=${file%%.*}
mkdir -p "$dir"
mv "$file" "$dir"
done

3 个答案:

答案 0 :(得分:0)

您可以使用'cut'分割文件/目录名称:

for file in *_*; do
  DIRNAME=$(echo $file | cut -d"_" -f1)
  if [[ ! -d ${DIRNAME} ]]; then
    mkdir ${DIRNAME}
  fi
  FILENAME=$(echo $file | cut -d"_" -f2)
  mv $file ${DIRNAME}/${FILENAME}
done

答案 1 :(得分:0)

循环体是错误的。它应该是:

dir=${file%_*}
newfn=${file#*_}
mkdir -p $dir && mv $file $dir/$newfn

根据您的要求,您可能会或可能不想添加警卫

if [[ -f $file ]]
then
   ...
fi

围绕这个。

答案 2 :(得分:0)

检查下面的一个班轮脚本是否相同。在包含 _ 格式的所有文件的目录中运行此脚本。它将遍历每个文件名,将在_之前占用第一部分,并将创建一个具有该名称的目录。之后,它将文件从父目录移动到新创建的目录,直到完成所有文件。

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