次のディレクトリがあります。
├── 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