查找并将文件上移一级

查找并将文件上移一级

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

基本上我有类似的东西

/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

相关内容