다음 디렉토리가 있습니다.
├── test
│ └── third2
│ ├── sec2
│ │ ├── sec
│ │ │ └── Backup
│ │ │ └── third3
│ │ │ └── sec2
│ │ │ └── sec
│ │ │ └── Backup
│ │ ├── sec5
│ │ ├── third
│ │ └── third3
│ │ └── sec2
│ │ ├── sec
│ │ ├── sec5
│ │ └── third
│ └── sec3
└── test.sh
"test/third2"
디렉토리를 하위 디렉토리로 이동하고 싶습니다 "test/third2/sec2"
.
따라서 다음과 같습니다.
├── test
│ └── sec2
│ ├── third2
│ │ ├── sec
│ │ │ └── Backup
│ │ │ └── third3
│ │ │ └── sec2
│ │ │ └── sec
│ │ │ └── Backup
│ │ ├── sec5
│ │ ├── third
│ │ └── third3
│ │ └── sec2
│ │ ├── sec
│ │ ├── sec5
│ │ └── third
│ └── sec3
└── test.sh
이렇게 하면 다음과 같은 오류 메시지가 나타납니다.
mv: cannot move 'third2' to a subdirectory of itself, 'third2/sec2/third2'
test.sh 코드:
cd test/
#mkdir third2/sec3
#mkdir test3
for f in *; do
if [ -d "$f" ]; then
cd "$f"
echo "cd directories $f"
for i in *; do
if [ -d "$i" ]; then
echo "Dir $i"
cd -
mv "$f" "$f"/"$i"
fi
done
fi
done
어떻게 해야 하나요? 저는 Unix를 처음 사용합니다.
Third2의 상위 디렉터리는 sec2여야 하고 sec 2의 상위 디렉터리는 test여야 합니다.
편집: 새로운 예 사용: 답변해 주셔서 감사합니다. 단일 디렉터리의 이름은 변경할 수 있지만 여러 디렉터리는 변경할 수 없습니다. 올바르게 수행되지 않았습니다.
다음 디렉토리가 있습니다.
├── songs
│ ├── Song 1
│ │ └── 1950
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ ├── D.txt
│ │ ├── E.txt
│ │ ├── F.txt
│ │ ├── G.txt
│ │ └── H.txt
│ ├── Song 2
│ │ ├── 1920
│ │ │ ├── A.txt
│ │ │ ├── B.txt
│ │ │ ├── C.txt
│ │ │ └── D.txt
│ │ └── 2000
│ │ ├── A.txt
│ │ └── B.txt
│ ├── Song 3
│ │ └── 2015
│ │ ├── A.txt
│ │ ├── B.txt
│ │ └── C.txt
│ ├── Song 4
│ │ └── 2013
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ └── D.txt
│ ├── Song 5
│ │ ├── 2012
│ │ │ ├── A.txt
│ │ │ └── B.txt
│ │ └── 2019
│ │ ├── A.txt
│ │ └── B.txt
│ └── Song 6
│ ├── 2011
│ │ └── A.txt
│ └── 2012
│ └── A.txt
├── songs.txt
다음 코드를 사용하여 songs.sh를 실행한 후:
cd songs/
for i in *; do
if [ -d "$i" ]; then
#echo "i == $i"
cd "$i"
for k in *; do
if [ -d "$k" ]; then
echo "test"
mv -f "$k" "$i"
fi
done
cd ..
mv -f "$i" "$k"
fi
done
cd ..
나는 다음과 같은 결과를 얻습니다.
── songs
│ ├── 1950
│ │ └── Song 1
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ ├── D.txt
│ │ ├── E.txt
│ │ ├── F.txt
│ │ ├── G.txt
│ │ └── H.txt
│ ├── 2000
│ │ └── Song 2
│ │ ├── 2000
│ │ │ ├── A.txt
│ │ │ └── B.txt
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ └── D.txt
│ ├── 2012
│ │ └── Song 6
│ │ ├── 2012
│ │ │ └── A.txt
│ │ └── A.txt
│ ├── 2013
│ │ └── Song 4
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ └── D.txt
│ ├── 2015
│ │ └── Song 3
│ │ ├── A.txt
│ │ ├── B.txt
│ │ └── C.txt
│ └── 2019
│ └── Song 5
│ ├── 2019
│ │ ├── A.txt
│ │ └── B.txt
│ ├── A.txt
│ └── B.txt
├── songs.txt
나는 그것을 갖고 싶다. :
├── songs
│ ├── 1920
│ │ └── Song 2
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ └── D.txt
│ ├── 1950
│ │ └── Song 1
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ ├── D.txt
│ │ ├── E.txt
│ │ ├── F.txt
│ │ ├── G.txt
│ │ └── H.txt
│ ├── 2000
│ │ └── Song 2
│ │ ├── A.txt
│ │ └── B.txt
│ ├── 2011
│ │ └── Song 6
│ │ └── A.txt
│ ├── 2012
│ │ ├── Song 5
│ │ │ ├── A.txt
│ │ │ └── B.txt
│ │ └── Song 6
│ │ └── A.txt
│ ├── 2013
│ │ └── Song 4
│ │ ├── A.txt
│ │ ├── B.txt
│ │ ├── C.txt
│ │ └── D.txt
│ ├── 2015
│ │ └── Song 3
│ │ ├── A.txt
│ │ ├── B.txt
│ │ └── C.txt
│ └── 2019
│ └── Song 5
│ ├── A.txt
│ └── B.txt
├── songs.txt
답변1
몇 가지 디렉토리의 이름만 변경하려는 것 같습니다.
mv test/third2/sec2 test/third2/third2
mv test/third2 test/sec2
답변2
편집 2:마지막 업데이트 이후 이는 매우 구체적인 사례입니다. 이 문제를 해결하는 방법은 여러 가지가 있습니다. 다음은 간단하고 구체적인 방법입니다.
#!/bin/bash
#cd songs/
for folder in */*/ ; # list all subfolders of current folder
do
song=$(dirname "$folder") # extract song
year=$(basename "$folder") # and year
if [ ! -d "$year" ]; then #check if year folder exists
mkdir "$year" #if not, create it
fi
mv "$folder" "$year/$song" #move and rename subfolder
rmdir "$song" #will throw error if not empty, it's dirty but quick
done
편집 1: 업데이트 내용을 보니 폴더 이름을 바꾸고 싶다고 하신 것 같은데요? 이 경우 다음 섹션만 업데이트하면 됩니다.
for i in *; do
if [ -d "$i" ]; then
echo "dir $i"
mv "$i" "$f"
cd -
mv "$f" "$i"
fi
원래
첫째, 디렉터리를 해당 하위 디렉터리로 이동할 수 없습니다. 그렇다면 해당 하위 디렉터리의 상위 디렉터리는 무엇입니까?
sec2를 상위로 전송한 다음 Third2로 전송해야 합니다 rmdir
.
#!/bin/bash
for f in *; do
if [ -d "$f" ]; then
cd "$f"
echo "cd dir $f"
for i in *; do
if [ -d "$i" ]; then
echo "dir $i"
mv "$i" ".."
cd -
rmdir "$f"
fi
done
fi
done
$f
비어 있지 않으면 오류가 발생합니다.
답변3
당신이 지금 어디에 있고 어디에 있고 싶은지 살펴보십시오. 다음을 수행해야 합니다.
mv -T test/third2 test/sec2
mv -T test/sec2/sec2 test/sec2/third2