4

Я пытаюсь найти файлы с определенным расширением, а затем переместить все их на один уровень вверх в иерархии папок.

В принципе у меня что то типа

/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 {} .. \

но я получаю разрешение отказано

2 ответа2

1

Создайте скрипт с именем move_to_parent.sh , сделайте его исполняемым.

#!/bin/bash

while [ $# -ge 1 ]
do
   parentPath=${1%/*/*};
   cp "$1" $parentPath;
   shift
done

Информация о замене параметров найдена здесь.

Вот еще один способ написания move_to_parent.sh с использованием awk -

#!/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
1

Если у вас есть GNU find, вы можете сделать (модифицировано из вашего примера):

find /path/to -type f -execdir mv {} .. \;

но Solaris использует POSIX find как стандарт, в котором отсутствует эта опция. Однако иногда доступны инструменты GNU (например, gfind).

Кроме того, ключ -mindepth , вероятно, был бы очень полезен в этом случае, чтобы возвращать файлы только с заданной минимальной глубиной каталога.


Без GNU find, используя вместо этого скрипт:

#!/bin/sh
IFS='
'
for i in $(find /path/to -type f); do
    echo mv -- "${i}" "${i%/*/*}"
done

Это будет работать, если имена файлов не содержат переводы строки. Сначала запустите его, как указано выше, и удалите echo если оно выглядит нормально (см. Также замечание -mindepth выше).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .