как сохранить имя файла, состоящее всего из 20 символов, и расширение файла .txt

Не забудьте правильно цитировать все расширения. Оболочка не будет просматривать строки в одинарных кавычках.

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".

5
20.04.2020, 14:54
4 ответа

вот что сработало:

for file in *
 do
 file2=$(echo ${file} | cut -c 1-20)
 mv ${file} ${file2}.txt
 done
0
19.03.2021, 02:27

Вы можете легко сделать это с помощью цикла оболочки в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запрашивать перед перезаписью, существует ли уже одно из новых имен.

11
19.03.2021, 02:27

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 символов -из -имени файла».

1
19.03.2021, 02:27

Предполагается, что все соответствующие имена файлов соответствуют 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.*
1
19.03.2021, 02:27

Теги

Похожие вопросы