2015-12-21 1 views
1

Когда яКак удалить скрытые символы после расширения файла в переменной

echo $filename 

я

Pew Pew.mp4 

Однако

echo "${#filename}" 

Возвращает 19

Как удалить все символы после расширения файла? Он должен работать независимо от расширения файла, поскольку имя файла в переменной не всегда соответствует * .mp4

+0

Как вы знаете, эти дополнительные символы являются частью расширения файла? (И если они есть, вы должны их выбросить?) Во всяком случае, (1) некоторые из символов на самом деле являются символами UTF8 в этом имени? (см. http://stackoverflow.com/a/31009961/2564301) и (2), если нет, лучше проверить свой жесткий диск. – usr2564301

+1

Хороший вопрос. Они не являются символами UTF8 в названии. Когда я создаю новый файл с именем $ filename.conf в качестве имени, он делает такой файл: Pew Pew.mp4 ?? [23; 0t.conf. Я не знаю, что это за персонажи, но я не думаю, что это мой жесткий диск. Это имена файлов, которые возвращает youtube-dl -get-filename – baruch

+0

Ouch - похоже, что какая-то командная команда переименования запускала amok. Возможно, с 'sed' можно отключить все после первого символа не ASCII. – usr2564301

ответ

0

Вы должны попытаться выяснить, почему у вас такие странные файлы, прежде чем исправлять его. Как только вы знаете, вы можете переименовать файлы.
Когда вы просто хотите переименовать 1 файл, используйте команду

mv "Pew Pew.mp4"* "Pew Pew.mp4" 

отрезав полное расширение (с filename=${filename%%.*}) не поможет вам, если вы хотите использовать оголенное расширение (mp4 или JPG или. ..). EDIT: Я думаю, что OP хочет работать, поэтому я даю еще одну попытку. Когда у вас есть короткий список расширений, вы можете попробовать

for ext in mpeg mpg jpg avo mov; do 
    for filename in *.${ext}*; do 
     mv "${filename%%.*}.${ext}"* "${filename%%.*}.${ext}" 
    done 
done 

Вы можете попробовать strings, чтобы получить читаемую строку.

echo "${filename}" | strings | wc 
# Rename file 
    mv "${filename}" "$(echo "${filename}"| strings)" 

EDIT: strings дает более 1 линии в результате и нежелательных пространств. Поскольку у Pew Pew есть пространство внутри, я надеюсь, что перед точкой будут все пробелы, подчеркивания и минусовые знаки.
новое_имя можно построить что-то вроде

tmpname=$(echo "${filename}"| strings | head -1) 
newname=${tmpname% *} 

# or another way 
newname=$(echo "${filename}"| sed 's/[[:alnum:]_- ]*\.[[:alnum:]]*\).*/\1/') 

# or another (the best?) way (hoping that the first unwanted character is not a space) 
newname="${filename%%[^[:alnum:]\.-_]*}" 
# resulting in 
mv "${filename}" "${filename%%[^[:alnum:]\.-_]*}" 
+0

Спасибо за помощь. echo "$ {filename}" | строки возвращают следующие 2 строки: «Pew Pew.mp4»; "[23; 0t". Я не знаю, откуда этот дополнительный текст, но я пытаюсь создать файл под названием «Pew Pew.mp4.conf». Каждый раз, когда я запускаю эти скрипты, $ filename будет содержать имя другого файла, который я загружаю, и я делаю файлы .conf для каждого из них. – baruch

+0

Когда вы отправляете результат через 'head -1', у вас будет Pew Pew. –

+0

Я пробовал это, и когда я попытался назвать его «Pew Pew.mp4.conf», я до сих пор получил «Pew Pew.mp4 .conf».Любая идея, почему это пространство появляется? – baruch

Смежные вопросы