2015-09-12 10 views
0

Я играл с mv, и теперь у меня есть ситуация. Раньше, скажем Папка 1 имела файл1,2,3.Как удалить промежуточные папки, содержащие только одну папку?

В настоящее время Folder1 имеет Folder2, у которого есть Folder3, у которого есть Folder4, который содержит file1,2,3.

Я пытаюсь написать сценарий bash таким образом, чтобы он идентифицировал промежуточные папки, содержащие только один каталог, и перемещал все его содержимое на один уровень, в конечном счете отдавая только Folder1-> file1,2,3, и папки отдыха удалялись.

Я пытался написать что-то вроде ниже, но я:

1.unable различать между файлами и папками

2.unable найти имя файла/каталога хранится внутри текущей папки

3. Не уверен, как это сделать рекурсивно.

#!/bin/bash 

echo "Directory Name?" 
read dir_name 

no_files=`ls -A| wc -l` 

if [ $no_file==1 ] && [ itisaDirectory()]; 
then `mv folder_name/* dir_name` 
fi 
+0

Подсказка: '[-d" $ file "]' будет истинным, если '$ file' является каталогом. – tripleee

+0

В вашем коде уже есть синтаксические ошибки; см. http://shellcheck.net/ для исправлений. (Тем не менее, он не может предупредить о сумасшедших обратных шагах вокруг команды 'mv'.) – tripleee

ответ

0

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

find . -type f -exec mv {} "${dir_name}" \; 2>/dev/null 
rm -r */ 

Вы просите что-то другое, только перемещать файлы, где промежуточный каталог уникален. Это тот случай, если только один субдир имеет этот каталог в качестве родителя. Родительский каталог может быть найден с помощью dirname. Если у дистриктера есть один субдир, только один субдир будет иметь его в качестве родителя. Вы можете перечислить все каталоги, найти родителя и выбрать уникальные пути.

find . -type d -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir" 
done 

Проблема в том, что в директории могут быть файлы. Мы стараемся улучшить выше решение:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir or one file" 
done 

Вы можете проверить содержимое директории с if [ -d "${dir}/*" ], но мне не нужно знать:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir or one file" 
    find "${dir}"/*/ -type f -exec mv {} "${dir_name}" \; 2>/dev/null 
done 

Путь $ {реж}/*/воли существует только тогда, когда $ {dir} имеет в нем подкаталог и будет перемещать файлы ниже. Когда $ dir имеет только один файл, команда find ничего не найдет.