我有以下目录:
├── 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 转移到父级,然后转移到rmdir
Third2。
#!/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