我有以下 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'