다음 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
다음 쉘스크립트는 귀하의 질문에 표시된 디렉토리 트리에 대해 작동해야 합니다.
#!/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
디렉토리를 입력하려면 "디렉토리 변경"을 선택하십시오 .쉘 스크립트를 작성하십시오.
이름을 지어줘요점이 없어, 예를 들어
shellscript
(스스로 움직이는 것을 원하지 않기 때문에)쉘 스크립트 실행
bash 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'