查找文件,创建子目录并移动

查找文件,创建子目录并移动

我有以下 Direcory 树。

Comb
|
|--- 1.json2
|--- 1.cc.json2.ml
|--- 102.cc.json2.pre2.ml
|--- 1.json2.pre1
|--- 102.json2.pre1

我需要 create 和 bash 才能得到这个结果。

Comb
|--|
   |-1
   |  |--- 1.json2
   |  |--- 1.cc.json2.ml
   |  |--- 1.json2.pre1
   |- 102
       |--- 102.cc.json2.pre2.ml    
       |--- 102.json2.pre1  

我尝试过类似的方法,但在某些时候会中断并丢失文件。

for file in *.cc.json2.pre2.ml; do mkdir -- "${file%.cc.json2.pre2.ml}"; mv -- "$file" "${file%.cc.json2.pre2.ml}"; done

for file in *.cc.json2.pre1.ml; do mkdir -- "${file%.cc.json2.pre1.ml}"; mv -- "$file" "${file%.cc.json2.pre1.ml}"; done

答案1

以下 shellscript 应该适用于您在问题中显示的目录树。

#!/bin/bash

for i in *.*
do
 if test -e "$i"
 then
  tmp="${i%%.*}"
  mkdir -p "$tmp"
  mv -i "$i" "$tmp"
 else
  echo "No file or directory matching '$i'"
 fi
done
  • “更改目录”,cd进入目录。

  • 创建 shell 脚本。

  • 给它起个名字没有任何点,例如shellscript(因为你不希望它自行移动),

  • 运行 shell 脚本

    bash shellscript
    
  • 如果您打算在目录树的顶部创建新文件并再次运行 shellscript,您可能希望“使其可执行”,

    chmod +x shellscript
    

    然后你可以“直接”运行它,

    ./shellscript
    

答案2

您可以使用glob模式来简化它。如果您在Comb目录中,那么您可以执行类似的操作。

mkdir 1 102
mv 1\.* 1/
mv 102\.* 102/

这个简单的任务不需要循环,但如果你有类似格式的文件, 3.somefile.ml 103.mm.ml 66.anotherfile.json你可以通过自动化来做得更好

names=(`ls -1 | grep -Po "^\d+" | uniq `)
mkdir ${names}
for i in ${names[@]}
do
 mv $i\.* $i        
done

glob也使用模式并为每个唯一编号的文件创建一个文件夹。

答案3

cd Comb
for i in *; do mkdir -p ${i%%.*txt}; mv $i ${i%%.*txt}; done

答案4

你的尝试并没有离你太远。尝试对您自己的代码进行小的修改:

$ for file in *.cc.json*ml; do mkdir -p ${file%%.*}; mv -v ${file%%.*}.* ${file%%.*}; done
renamed '102.cc.json2.pre2.ml' -> '102/102.cc.json2.pre2.ml'
renamed '102.json2.pre1' -> '102/102.json2.pre1'
renamed '1.cc.json2.ml' -> '1/1.cc.json2.ml'
renamed '1.json2' -> '1/1.json2'
renamed '1.json2.pre1' -> '1/1.json2.pre1'

相关内容