我正在尝试搜索具有特定扩展名的文件,然后将它们全部移动到文件夹层次结构中的上一级。
基本上我有类似的东西
/path/to/application/files/and/stuff/a1/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a2/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a3/nolongerneededirectory/*.*
我试图像这样将它们向上移动:
/path/to/application/files/and/stuff/a1/*.*
/path/to/application/files/and/stuff/a2/*.*
/path/to/application/files/and/stuff/a3/*.*
理想情况下它会做类似的事情:
-bash-3.2$ find /path/to/ -name '*.txt'
output:
/path/to/directories1/test1/test1.txt
/path/to/directories2/test2/test2.txt
/path/to/directories3/test3/test3.txt
then
mv /path/to/directories1/test1/test1.txt /path/to/directories1/test1.txt
mv /path/to/directories2/test2/test2.txt /path/to/directories2/test2.txt
mv /path/to/directories3/test3/test3.txt /path/to/directories3/test3.txt
我一直在尝试不同的选择并询问周围的人,有人有什么想法吗?
编辑1:
所以我尝试了
`find /path/to/parent/dir -type f -exec mv {} .. \
但我收到“权限被拒绝”
答案1
如果你有GNU 查找,你可以这样做(根据你的例子修改):
find /path/to -type f -execdir mv {} .. \;
但 Solaris 使用 POSIX find 作为标准,缺少此选项。gfind
但有时可以使用 GNU 工具(例如)。
此外,-mindepth
在这种情况下,开关可能非常有用,因为它仅返回给定最小目录深度的文件。
没有 GNU find,改用脚本:
#!/bin/sh
IFS='
'
for i in $(find /path/to -type f); do
echo mv -- "${i}" "${i%/*/*}"
done
除非文件名包含换行符,否则此方法有效。首先按上述方法运行,echo
如果一切正常,则删除 (另请参阅-mindepth
上述注释)。
答案2
创建一个名为的脚本move_to_parent.sh
,并使其可执行。
#!/bin/bash
while [ $# -ge 1 ]
do
parentPath=${1%/*/*};
cp "$1" $parentPath;
shift
done
信息参数替换在此处找到。
这是使用 awk 进行写作的另一种方式move_to_parent.sh
-
#!/bin/bash
while [ $# -ge 1 ]
do
echo $1 | awk -F/ '
{
parentPath="";
for(loop=2;loop<NF-1;loop++)
{
parentPath=parentPath"/"$loop;
}
sub(/\ /, "\ ", $0);
system("mv " $0 " " parentPath );
}'
shift
done
运行如下 -
find /path/to/parent/dir -iname "*.txt" | xargs /path/to/scripts/move_to_parent.sh