查找和移动文件上一级

ide*_*545 5 unix shell solaris

我正在尝试搜索具有特定扩展名的文件,然后将所有文件在文件夹层次结构中向上移动一层。

基本上我有类似的东西

/path/to/application/files/and/stuff/a1/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a2/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a3/nolongerneededirectory/*.*
Run Code Online (Sandbox Code Playgroud)

我试图像这样将它们向上移动:

/path/to/application/files/and/stuff/a1/*.*
/path/to/application/files/and/stuff/a2/*.*
/path/to/application/files/and/stuff/a3/*.*
Run Code Online (Sandbox Code Playgroud)

理想情况下,它会执行以下操作:

-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
Run Code Online (Sandbox Code Playgroud)

我一直在玩不同的选择并四处打听,有人有什么想法吗?

编辑 1:

所以我试过了

`find /path/to/parent/dir -type f -exec mv {} .. \
Run Code Online (Sandbox Code Playgroud)

但我得到一个权限被拒绝

bry*_*yan 1

创建一个名为 的脚本move_to_parent.sh,使其可执行。

#!/bin/bash

while [ $# -ge 1 ]
do
   parentPath=${1%/*/*};
   cp "$1" $parentPath;
   shift
done
Run Code Online (Sandbox Code Playgroud)

有关参数替换的信息可在此处找到。

这是使用 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
Run Code Online (Sandbox Code Playgroud)

运行如下 -

find /path/to/parent/dir -iname "*.txt" | xargs  /path/to/scripts/move_to_parent.sh
Run Code Online (Sandbox Code Playgroud)