Перечислите все каталоги с пробелами в названии - PullRequest
1 голос
/ 07 марта 2012

Я хочу перечислить все каталоги, используя скрипт оболочки. Я использую следующий код:

DIR="$1"

if [ $# -ne 1 ]
then
    echo "Usage: $0 {dir-name}"
exit 1
fi

cd "$DIR"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for user in $( ls -d */)
do
  for dirs in $( ls -d $PWD/$user*)
  do
    echo $PWD/$user/$dirs;
  done
done
IFS=$SAVEIFS

Это работает для меня, если в этом каталоге нет пробелов, иначе он разделит выходные данные на все пробелы в нем. Я получил следующий вывод:

abhinaba@abhinaba-desktop:~/software$ sh test.sh /media/2C44138344134F48/RB1
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/VB*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/DLI*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/3001/*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/VB*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/DLI*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/3002/*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/VB*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/DLI*: No such file or directory
ls: cannot access /m: No such file or directory
ls: cannot access dia/2C44138344134F48/RB1/3003/*: No such file or directory

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

EDITED: удалено ls для оптимизации скрипта (из tripleee)

Если вы используете оболочку BASH:

#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
DIR="$1"

if [ $# -ne 1 ]
 then
 echo "Usage: $0 {dir-name}"
 exit 1
fi

cd "$DIR"

for user in $(ls -d */)
 do
 for dirs in $(ls -d $user*)
  do
  echo $dirs
 done
done

IFS=$SAVEIFS

Запустите приведенный выше скрипт "test.sh" следующим образом:

bash test.sh /media/2C44138344134F48/RB1

или просто (если вы уже находитесь в BASH и установили флаг eXecutable)

./test.sh /media/2C44138344134F48/RB1

Ссылка

1 голос
/ 07 марта 2012

На самом деле было бы проще всего найти:

find PATH -type d -name '* *'

Или, если вам нужно что-то сделать с каждым результатом, рассмотрите возможность передать его в xargs

find PATH -type d -name '* *' -print0 | xargs -0 run-some-command

Или если вы простоесли все каталоги благополучно экранированы в аргументы, то:

find PATH -type d -print0 | xargs -0 run-some-command

Внутри run-some-command каждый аргумент сценария будет правильно установлен для каждого имени каталога независимо от того, какие символы он содержит.

0 голосов
/ 07 марта 2012

Простой скрипт ниже сделает то, что вам нужно.

#!/bin/bash

function usage() {
        echo "Usage: `basename $0` <dir-name>"
}


if [ "x$1" = "x" ]
then
        usage
        exit 0
fi

find "$1" -type 'd'
...