Intereting Posts
Параметры TCP SACK и масштабирование окна не изменяются на Ubuntu 16.04 Принудительная перечитание таблицы разделов: разница между BLKRRPART и BLKPG ioctl? (Linux) Не удается создать корневую тюрьму неожиданные символы в ведомых файлах зоны DNS BIND Как сделать файл djvu доступным для поиска Удалить последнюю запятую в шаблоне Как предотвратить `rlwrap` от сохранения пароля в файле входных данных? Как удалить файл, который я случайно создал с именем $ file? Редактировать столбчатые данные в vim Как прекратить получать спам-сообщения с сервера Не удается подключиться к MySql с помощью PHP на Linux Поиск и замена в нескольких файлах на основе условия Выход из сервера имен не может быть использован: временный сбой при разрешении имени (-3) 3 июл 07:24:03 ntpdate Как я могу получить поддержку TLSv1.2 в Apache на RHEL6 / CentOS / SL6? Измените метку времени, чтобы использовать эпоху. Bash get error как дополнительный операнд

скрипт bash – выравнивает структуру каталогов

Я ищу сценарий оболочки, который сгладил бы данную структуру каталогов, но ТОЛЬКО если в этом каталоге есть только 1 подпапка. Например: скрипт сгладит эту папку:

/folder /subfolder file1 file2 

в:

 /folder file1 file2 

но пропустил (ничего не сделал) эту папку

 /folder /subfolder1 /subfolder2 

Огромное спасибо заранее.

Стив

Несколько наивный подход:

 #!/bin/sh for dir do # get list of directories under the directory $dir set -- "$dir"/*/ # if there are more than one, continue with the next directory # also continue if we didn't match anything useful if [ "$#" -gt 1 ] || [ ! -d "$1" ]; then continue fi # the pathname of the subdirectory is now in $1 # move everything from beneath the subdirectory to $dir # (this will skip hidden files) mv "$1"/* "$dir" # remove the subdirectory # (this will fail if there were hidden files) rmdir "$1" done 

Используя bash :

 #!/bin/bash for dir do # get list of directories under the directory $dir subdirs=( "$dir"/*/ ) # if there are more than one, continue with the next directory # also continue if we didn't match anything useful if [ "${#subdirs[@]}" -gt 1 ] || [ ! -d "${subdirs[0]}" ]; then continue fi # the pathname of the subdirectory is now in ${subdirs[0]} # move everything from beneath the subdirectory to $dir # (this will skip hidden files) mv "{subdirs[0]}"/* "$dir" # remove the subdirectory # (this will fail if there were hidden files) rmdir "${subdirs[0]}" done 

Оба сценария будут работать как

 $ ./script.sh dir1 dir2 dir3 

или же

 $ ./script.sh */ 

запустить его по всем каталогам в текущем каталоге.

Помимо предостережений в коде, это также не сможет связать символические ссылки. Для этого вам нужно будет пройти через все возможные места в файловой системе и найти ссылки, указывающие на подкаталог в /folder и заново создать их, чтобы они указывали на правильное новое место. Я не буду писать код далеко, что здесь.

Кроме того, при перемещении объектов из подкаталога не выполняется проверка, чтобы убедиться, что в /folder нет записей с такими же именами.