Сценарий оболочки для перемещения всех файлов из подпапок в родительскую папку

Какие разрешения установлены для этого файла? Вам нужно будет убедиться, что файл readable и executable смогут его запустить.

Например, этот файл доступен только для чтения и записывается root:


-rw------- 1 root root 622 Aug 22  2009 test.py

Чтобы иметь возможность запускать его как обычного пользователя, для всех пользователей ему необходимо будет иметь считываемые и исполняемые биты. Вместо этого разрешения должны выглядеть примерно так, как показано на рисунке ls -l в терминале:


-rwxr-xr-x 1 root root 622 Aug 22  2009 test.py
31
задан 5 June 2012 в 10:46

15 ответов

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для их перемещения в текущий каталог.

51
ответ дан 25 May 2018 в 10:35
  • 1
    он также пытается переместить файлы, которые уже находятся в родительском каталоге. – virpara 5 June 2012 в 22:57
  • 2
    virpara: теперь это ваше издание забывает все файлы в каталогах .dot. Переделал его с помощью -mindepth 2 вместо этого, чтобы подавить предупреждения. – Tuminoid 6 June 2012 в 12:04
  • 3
    С GNU find вы можете быть немного более элегантным и не создавать процесс mv для каждого файла: find A -mindepth 2 -type f -exec mv -t A \{\} + – David Foerster 24 September 2014 в 01:09
  • 4
    Дэвид, ваша версия работает до тех пор, пока вы не нажмете максимальное ограничение длины командной строки, что не так сложно сделать, учитывая, как поиск печатает пути, особенно в том случае, если вы вызываете его из каталога, отличного от A, как в вашем примере. – Tuminoid 24 September 2014 в 14:24
  • 5
    Это очень опасно. если у вас есть файлы с одинаковым именем файла в разных подпапках, вы перепишете их все с помощью последней находки. Лучше использовать mv с --backup = numbered: find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \; – RoVo 8 May 2017 в 12:18

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 31 July 2018 в 10:32

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 31 July 2018 в 11:34

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 2 August 2018 в 00:48

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 6 August 2018 в 00:57

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 10 August 2018 в 07:06

Перейдите в каталог A и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

, что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла для перемещения в текущий каталог.

56
ответ дан 15 August 2018 в 19:04
  • 1
    он также пытается переместить файлы, которые уже находятся в родительском каталоге. – virpara 5 June 2012 в 22:57
  • 2
    virpara: теперь это ваше издание забывает все файлы в каталогах .dot. Переделал его с помощью -mindepth 2 вместо этого, чтобы подавить предупреждения. – Tuminoid 6 June 2012 в 12:04
  • 3
    – David Foerster 24 September 2014 в 01:09
  • 4
    Дэвид, ваша версия работает до тех пор, пока вы не нажмете максимальное ограничение длины командной строки, что не так сложно сделать, учитывая, как поиск печатает пути, особенно в том случае, если вы вызываете его из каталога, отличного от A, как в вашем примере. – Tuminoid 24 September 2014 в 14:24
  • 5

Ну, вы можете создать файл и называть его «cutme» (создать файл под названием cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

Вы хотите сделать это рекурсивно (во вложенных папках и вложенных папках этих подпапок). Вы хотите пропустить перемещение файла сценария. У вас есть разрешения на перемещение файлов в этой папке. Файлы могут содержать или не включать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на название cutme внутри строки. Это будет то же самое, что и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 25 May 2018 в 10:35
  • 1
    Почему я должен пытаться переместить файлы, которые уже находятся в родительском каталоге? – virpara 5 June 2012 в 22:56
  • 2
    Вы запускаете скрипт изнутри папки. Каждый файл в нем, если внутри подпапки или нет, переместится в родительскую папку папки. Родительская папка здесь является родительской по отношению к тому, где находится скрипт. Фактически, изменяя последние 2 точки, вы можете указать, куда переместить все файлы внутри папки, в которой вы запускаете скрипт. – Luis Alvarado♦ 5 June 2012 в 23:01

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 31 July 2018 в 11:34

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 2 August 2018 в 00:48

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 4 August 2018 в 16:18

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 6 August 2018 в 00:57

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 7 August 2018 в 18:22

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 10 August 2018 в 07:06

Ну, вы можете создать файл и называть его «cutme» (для создания файла с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.) например, и вставьте в него следующее. предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла сценария
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут содержать или не содержать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на имя cutme внутри линии. Он должен быть таким же, как и скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки выполните следующее в той же папке, что и скрипт:

chmod +x cutme , Это даст вашему новому файлу флаг «Исполняемый файл», чтобы вы могли выполнить его следующим образом: ./cutme.

4
ответ дан 15 August 2018 в 19:04
  • 1
    – virpara 5 June 2012 в 22:56
  • 2
    Вы запускаете скрипт изнутри папки. Каждый файл в нем, если внутри подпапки или нет, переместится в родительскую папку папки. Родительская папка здесь является родительской по отношению к тому, где находится скрипт. Фактически, изменяя последние 2 точки, вы можете указать, куда переместить все файлы внутри папки, в которой вы запускаете скрипт. – Luis Alvarado♦ 5 June 2012 в 23:01

Другие вопросы по тегам:

Похожие вопросы: