Скрипт Bash для папок tar с пробелами - PullRequest
2 голосов
/ 29 августа 2011

Я пытаюсь создать сценарий bash, который будет рекурсивно обрабатывать все папки.

Однако у меня возникла проблема, поскольку в некоторых именах папок есть пробелы и т. Д. Поэтому он работает неправильно.

Что у меня есть:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in $(ls ./2011)
do
    tar -zcvf "$i".tar.gz "$i"
done
IFS=$SAVEIFS

Однако возникают проблемы, например:

tar -zcvf St Patricks Day Bar Night.tar.gz St Patricks Day Bar Night

Пробелы вызывают проблемы, как это можно обойти?

Ответы [ 4 ]

7 голосов
/ 29 августа 2011

Используйте двойные кавычки вокруг имени файла и расширение имени файла bash вместо ls.

#!/bin/bash
for i in ./*
do
    echo tar -zcvf "$i.tar.gz" "$i"
done
1 голос
/ 29 августа 2011
ls ./2011 | while read i
do
    echo tar -zcvf "$i.tar.gz" "$i"
done
0 голосов
/ 29 августа 2011

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

yourscript "St. Patrick's Day Bar Night"

Что бы это ни стоило, ls в кавычках лишнее; просто сделайте for i in ./2011/* вместо этого. Насколько я могу судить, ерзание с IFS просто ненужно, но может также вызывать проблемы.

0 голосов
/ 29 августа 2011

Что против

#!/bin/bash
ls ./2011 | while read i; do
do
    printf "%s***" tar -zcvf "$i.tar.gz" "$i"
done

?Имейте в виду, что материал printf служит для просмотра границ между аргументами.

...