我刚刚切换到linux,我正在尝试编写我的第一个bash脚本。我有一个包含大量文件夹的文件夹,所有文件夹都包含包含文件的子文件夹。类似的东西:
MainFolder
。 。
我想将子文件夹中包含的所有文件移动到其父文件夹。我的第一直觉是尝试编写一个for循环。我可以使用以下命令一次执行一个文件夹:
mv MainFolder/Folder1/*/* MainFolder/Folder1/
但我希望编写一个bash脚本来遍历主目录中的所有文件夹。以下是我到目前为止的情况:
#!/bin/bash
dir1="/pathto/MainFolder"
subs= ls $dir1
for i in $subs; do
mv "$dir1/$i/*/*" "$dir1/$i/"
done
这显然不起作用,但我不明白我哪里出错了。
我也尝试过:
mv MainFolder/*/*/* MainFolder/*/
带来了相当糟糕的结果。一旦我让文件移动正常,我还想删除循环中的旧子文件夹。
答案 0 :(得分:4)
小变化。改变
subs=ls $dir1
到
subs=`ls $dir1`
注意反引号。反引号实际上执行bash命令并返回结果。如果您在该行后发布echo $subs
,则会发现它正确地列出了folder1
,folder2
。
第二个小改动是删除mv
命令中的双引号。将它们更改为
mv $dir1/$i/*/* $dir1/$i
双引号采用文字文件名,而删除引号采用递归目录模式。
之后,你的初始for循环确实是正确的。它会将所有内容从sub1
和sub2
移动到folder1
等等。
答案 1 :(得分:0)
dir1 =“ / pathto / MainFolder”
subs = ls $dir1
对于$ subs中的i;做
mv $ dir1 / $ i / / $ dir1 / $ i
完成
答案 2 :(得分:0)
是的-这是可行的解决方案
#!/bin/bash
mainDir="$(dirname $(realpath $0))/store/media"
subs=`ls $mainDir`
for i in $subs; do
if [[ -d "$mainDir/$i" ]]; then
mv "$mainDir/$i"/* "$mainDir/"
rm -rf "$mainDir/$i"
fi
done