2016-09-16 116 views
0

我一直在试图编写一段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 
+1

您当前的脚本有什么问题? – Inian

+0

你想创建名称为'123','abc','654'和'zxy'的空文件吗?或文件存在? – Inian

回答

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 
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 
+0

当'mv'移动文件'123','abc','654'和'zxy'不存在时,这将不起作用。目前尚不清楚OP是否需要创建空文件或者存在原始文件。 – Inian

+0

请提供无法使用的示例。 – chenchuk

+0

并不意味着错误的答案,但是对于文件夹folder1_123,脚本将创建一个新文件夹folder1(如果它不存在)(应该是'mkdir -p'),并且文件'123'应该出现在当前文件夹中,以便它被复制到'folder1'。当你试图移动一个不存在的文件时,'mv'将crib说'没有这样的文件..'。这就是为什么说,目前还不清楚是否需要创建OP尚未响应的空文件。谢谢。 – Inian

0

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

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

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

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

解决这个问题。

相关问题