2013-05-02 4 views
0

Я пишу скрипт следующим образом:Баш сценариев копирование всех файлов в папке

for file in `ls` 
do 
    mkdir "$file"_folder 
    cp $file "$file"_folder 
done 

То, что я хочу сделать, это сделать папку для каждого файла в текущем каталоге с его именем, а затем подчеркнуть в качестве имени, а затем скопируйте в него этот файл. Моя проблема в том, что имена файлов содержат пробелы. Как я могу избежать их? Есть много ресурсов, объясняющих, как это сделать для переменных, но ни одно из них не может быть применено к этой ситуации, когда я использую цикл for для получения имен.

+0

Проблема в том, что вы используете вывод 'ls' для управления циклом. Ваше цитирование внутри цикла идеально. – tripleee

+0

К сожалению, не совсем совершенный; как отмечено в одном из ответов, вам следует дважды указывать все переменные интерполяции (по крайней мере, пока вы не узнаете, при каких обстоятельствах не стоит цитировать). – tripleee

ответ

2

Не используйте ls там, используйте раскол оболочки. (В общем, do not parse the output of ls.)

for file in * 
do 
    # only consider files, not directories 
    if [ -f "$file" ] ; then 
    new_dir="$file"_folder 
    # create the directory 
    if [ ! -d "$new_dir" ] ; then 
     mkdir "$new_dir" 
     if [ $? -ne 0 ] ; then 
     # handle directory creation eror 
     fi 
    fi 
    # possibly check for the copied file existence here 
    # and deal with that appropriately (i.e. skip/error/copy anyway) 
    cp "$file" "$new_dir" 
    fi 
done 
+0

Вы забыли кавычки вокруг первого '$ файла' в команде' cp'. –

+0

О, совершенно верно. Не слишком пристально смотрели ... – Mat

+0

Вам не нужно было добавлять 'nullglob' в свое более раннее решение; если 'file' установлен в' '* '', '[-f" $ {file} "]' вычисляет false, так или иначе пропускает возможно несуществующий файл с именем '*'. –

0

Вам do not parse ls именно по этой причине

for file in * 
do 
    mkdir "${file}_folder" 
    cp "$file" "${file}_folder" 
done 
+0

Без 'nullglob', это не сработает, если нет файлы в каталоге ('файл' будет установлен в литерал' * '), поэтому' [-f "$ {file}"] 'проверяет ответ Мат. –

1

Как насчет

find . -type f -exec mkdir {}_folder \; -exec cp {} {}_folder \; 

Он находит все обычные файлы в текущем каталоге, создает (первый -exec) и копирует файл в новую папку (второй -exec).

Смежные вопросы