Не копируйте папку, только копируйте ее содержимое:
## Create the target directory. The -p suppresses error messages
## if the directory already exists
mkdir -p outputFolder
## Copy the contents recursively, this will not recreate the parent
cp -R inputfolder/* outputfolder/
Таким образом вы оба убедитесь, что целевой каталог создается при первом запуске скрипта и избежать проблемы при повторном запуске.
Крис Даун очень правильно указывает, что в bash будут пропущены файлы, имена которых начинаются с .
. Чтобы избежать этого, вы можете запустить shopt -s dotglob
перед выполнением указанной выше команды.
Оба параметра -p
для mkdir
и -R
для cp
определены POSIX, так что это должно быть идеально переносимым.
Заменить *любым специальным символом можно с помощью команды tr
.
#!/bin/bash
mystring="This is my number: 12345"
echo $mystring | sed 's/[0-9]/*/g'
echo "abc 434 pankaj 444"| tr "[0-9]" "@"
abc @@@ pankaj @@@
В зависимости от того, хотите ли вы заменить цифры или целые числа (наборы последовательных цифр )на @
, вы можете использовать команду tr
без или с опцией -s
:
$ echo "abc 434 pankaj 444" | tr '[:digit:]' '[@*]'
abc @@@ pankaj @@@
$ echo "abc 434 pankaj 444" | tr -s '[:digit:]' '[@*]'
abc @ pankaj @
Опция -s
команды tr
заставляет утилиту «выжимать» любой последовательно встречающийся символ из второго аргумента, найденного в данных. В этом случае использование -s
приводит к тому, что tr
объединяет наборы символов @
в одиночные символы @
.
Два аргумента [:digit:]
и [@*]
сообщают tr
заменить цифры символами @
. Большинство (всех? )реализации tr
позволяют вам писать @
вместо [@*]
в качестве второго аргумента. [@*]
буквально означает «столько @
, сколько символов в наборе, описанном первым аргументом».
Обратите внимание, что tr
будет сжимать во входных данных любые до -существующие последовательности последовательных @
символов, если действует -s
.
Ваш подход с sed
не работает должным образом, потому что вы вставляете символ @
везде, где есть ноль или более совпадений с цифрой. Между каждым символом во входных данных есть ноль цифр, поэтому выражение совпадает между каждым символом.
Модифицированная подстановка, которая будет работать правильно и заменит ряды цифр одним @
, будет
sed 's/[[:digit:]]\{1,\}/@/g'
Используя \{1,\}
вместо *
(, что само по себе является тем же самым, что и \{0,\}
), мы обеспечиваем по крайней мере одно соответствие предыдущему выражению.Вы увидите, что \{1,\}
записывается как +
в расширенных регулярных выражениях.
Удалив \{1,\}
из выражения, оставив замену как s/[[:digit:]]/@/g
, вы замените каждую отдельную цифру на @
.