Не забудьте правильно цитировать все расширения. Оболочка не будет просматривать строки в одинарных кавычках.
path_value='/home/username/filename$1.class'
printf '%s\n' "$path_value"
Выходы /home/username/filename$1.class
.
su username -c "printf '%s\n' '$path_value'"
Идентичный вывод.
Во второй команде текущая оболочка расширит значение path_value
внутри команды, так как оно заключено в двойные кавычки. Затем внутренний printf
напечатает строку с одинарными кавычками.
Связанные:
Обратите внимание, что ${variable}
точно такое же, как $variable
. Добавление {...}
никоим образом не заключает его в кавычки и необходимо только в том случае, если символ, непосредственно следующий за расширением, иначе был бы принят как часть его имени, как в "${variable}x"
.
вот что сработало:
for file in *
do
file2=$(echo ${file} | cut -c 1-20)
mv ${file} ${file2}.txt
done
Вы можете легко сделать это с помощью цикла оболочки вbash
:
cd /path/to/files/;
for file in *; do
echo mv -i -- "$file" "${file:0:20}.txt"
done
Когда вы будете удовлетворены тем, что вам нужно, удалите эхо, чтобы фактически переименовать файлы:
cd /path/to/files/;
for file in *; do
mv -i -- "$file" "${file:0:20}.txt"
done
-i
заставит mv
запрашивать перед перезаписью, существует ли уже одно из новых имен.
Fedora и Solaris поддерживают оболочку bash:
С циклом 'for' иногда без обработки пути и имени файла по отдельности обрабатываются первые 20 символов упомянутого пути, но не фактические имена файлов.
Так что это будет делать именно то, что вы хотите сделать, не будет переходить к подкаталогам (если вы хотите, чтобы подкаталоги обрабатывались, удалите параметр «-maxdepth 0»:
find /path/of/the/files/* -maxdepth 0 -type f| xargs -I[] bash -c 'val="[]";file=${val##*/};newfile=${file:0:20};mv $val ${val%/*}/$newfile.txt'
Параметр-I в xargs заменяет каждое имя файла (, включая путь ), найденный на «[] », и мы выполняем команды bash для каждого[] ->имя файла , где мы сохраняем это в переменной $val и извлекаем путь и имена файлов,получить только первые 20 символов имени файла и переместить его как «mv полный путь -с -полным путем имени файла -без имени файла/первых 20 символов -из -имени файла».
Предполагается, что все соответствующие имена файлов соответствуют hhslog.*
в текущем каталоге. Затем с помощью утилиты Perl rename
:
rename 's/(.{20}).*/$1.txt/' hhsLog.*
Это применяет замену Perl s/(.{20}).*/$1.txt/
к каждому имени файла. Это усекает имена до 20 символов, а затем добавляет суффикс имени файла .txt
.
Чтобы сократить имена в начале }
, используйте
rename 's/([^}]+).*/$1.txt/' hhsLog.*
или
rename -n 's/(.+?)}.*/$1.txt/' hhsLog.*
Чтобы обрезать имена до первого символа, который не является символом слова или точкой, используйте
rename 's/([\w.]+).*/$1.txt/' hhsLog.*