I want to rename all files in a directory from *.ts to *.mkv [duplicate]
This question already has an answer here:
Changing extension to multiple files
12 answers
Rename all the files in .ts files in a directory
My echo command works but not if I try to make it a new variable.
#!/bin/sh
for file in "${1}"/*.ts; do
echo ${file} | sed -e 's|.ts|.mkv|'
new_name=${file} | sed -e 's|.ts|.mkv|'
done
shell-script files rename
marked as duplicate by Jeff Schaller, Sparhawk, Isaac, heemayl, Mr Shunz Jan 28 at 9:50
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
Changing extension to multiple files
12 answers
Rename all the files in .ts files in a directory
My echo command works but not if I try to make it a new variable.
#!/bin/sh
for file in "${1}"/*.ts; do
echo ${file} | sed -e 's|.ts|.mkv|'
new_name=${file} | sed -e 's|.ts|.mkv|'
done
shell-script files rename
marked as duplicate by Jeff Schaller, Sparhawk, Isaac, heemayl, Mr Shunz Jan 28 at 9:50
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
Just userename. If the Perl version, it's justrename 's/.ts$/.mkv' *.
– Sparhawk
Jan 28 at 1:38
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
1
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Are your files named with.tsactually Matroska files? Why are they all misnamed?
– jamesdlin
Jan 28 at 5:57
add a comment |
This question already has an answer here:
Changing extension to multiple files
12 answers
Rename all the files in .ts files in a directory
My echo command works but not if I try to make it a new variable.
#!/bin/sh
for file in "${1}"/*.ts; do
echo ${file} | sed -e 's|.ts|.mkv|'
new_name=${file} | sed -e 's|.ts|.mkv|'
done
shell-script files rename
This question already has an answer here:
Changing extension to multiple files
12 answers
Rename all the files in .ts files in a directory
My echo command works but not if I try to make it a new variable.
#!/bin/sh
for file in "${1}"/*.ts; do
echo ${file} | sed -e 's|.ts|.mkv|'
new_name=${file} | sed -e 's|.ts|.mkv|'
done
This question already has an answer here:
Changing extension to multiple files
12 answers
shell-script files rename
shell-script files rename
edited Jan 28 at 1:32
Jeff Schaller
40.9k1056130
40.9k1056130
asked Jan 28 at 1:24
NasKarNasKar
132
132
marked as duplicate by Jeff Schaller, Sparhawk, Isaac, heemayl, Mr Shunz Jan 28 at 9:50
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Jeff Schaller, Sparhawk, Isaac, heemayl, Mr Shunz Jan 28 at 9:50
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
Just userename. If the Perl version, it's justrename 's/.ts$/.mkv' *.
– Sparhawk
Jan 28 at 1:38
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
1
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Are your files named with.tsactually Matroska files? Why are they all misnamed?
– jamesdlin
Jan 28 at 5:57
add a comment |
2
Just userename. If the Perl version, it's justrename 's/.ts$/.mkv' *.
– Sparhawk
Jan 28 at 1:38
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
1
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Are your files named with.tsactually Matroska files? Why are they all misnamed?
– jamesdlin
Jan 28 at 5:57
2
2
Just use
rename. If the Perl version, it's just rename 's/.ts$/.mkv' *.– Sparhawk
Jan 28 at 1:38
Just use
rename. If the Perl version, it's just rename 's/.ts$/.mkv' *.– Sparhawk
Jan 28 at 1:38
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
1
1
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Are your files named with
.ts actually Matroska files? Why are they all misnamed?– jamesdlin
Jan 28 at 5:57
Are your files named with
.ts actually Matroska files? Why are they all misnamed?– jamesdlin
Jan 28 at 5:57
add a comment |
5 Answers
5
active
oldest
votes
The simplest solution would be to tell you to change the assignment to:
new_name=$( echo ${file} | sed -e 's|.ts|.mkv|' )
But a better solution would be to do:
new_name="${file%.ts}.mkv"
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in"${1}"/*.tsI don't see how a.mkvfile gets in the list. @NasKar
– Isaac
Jan 29 at 6:28
add a comment |
find . -maxdepth 1 -type f -name '*.ts' -exec rename .ts .mkv {} "+"
Run this in the directory containing the .ts files.
add a comment |
#!/bin/sh
for file in "${1}"/*.ts; do
mv "${file}" "$(basename "${file}").mkv"
done
add a comment |
rename is what you're looking for :
rename '.ts' '.mkv' "${1}/*.ts"
add a comment |
By using $file unquoted in your code, you invite the shell to split its contents into words based on the value of $IFS (space, tab and newline by default). Those words would then undergo filename expansion if they contained any globbing patterns.
By using echo, you would possibly also expand backslash sequences like n and t depending on what shell options happened to be set (xpg_echo).
Your first sed command would replace any character followed by ts in the filename with .mkv. This means that the filename bats.ts would be changed to b.mkv.ts.
The second line in the loop is nonsensical, as it takes the output of an assignment and passes it to sed over a pipe.
Assigning the output of a command to a variable is done with command substitutions:
variable=$( some_command )
#!/bin/sh
for name in "$1"/*.ts; do
mv -i "$name" "${name%.ts}.mkv"
done
This would loop over all files having a filename suffix of .ts in the directory given by "$1". Each file would be renamed to the same name, but with the .ts filename suffix removed and the .mkv suffix inserted at the end of the filename.
The variable substitution ${variable%pattern} would remove the shortest suffix in $variable that matches pattern. This would work even if the filename happened to contain embedded newlines.
By using mv -i we hopefully prevent the function from accidentally overwriting existing files. Another way to do that would be to do something like
#!/bin/sh
for name in "$1"/*.ts; do
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In addition to this test, you may actually want to check whether $name exists to start with. If the pattern "$1"/.*ts does not match any filenames, then it would by default remain unexpanded. We can catch that with
#!/bin/sh
for name in "$1"/*.ts; do
[ ! -e "$name" ] && break
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In the bash shell, you could use shopt -s nullglob to make nonmatching patterns expand to nothing instead. In bash you may also want to use shopt -s dotglob if you want to additionally match hidden filenames.
add a comment |
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
The simplest solution would be to tell you to change the assignment to:
new_name=$( echo ${file} | sed -e 's|.ts|.mkv|' )
But a better solution would be to do:
new_name="${file%.ts}.mkv"
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in"${1}"/*.tsI don't see how a.mkvfile gets in the list. @NasKar
– Isaac
Jan 29 at 6:28
add a comment |
The simplest solution would be to tell you to change the assignment to:
new_name=$( echo ${file} | sed -e 's|.ts|.mkv|' )
But a better solution would be to do:
new_name="${file%.ts}.mkv"
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in"${1}"/*.tsI don't see how a.mkvfile gets in the list. @NasKar
– Isaac
Jan 29 at 6:28
add a comment |
The simplest solution would be to tell you to change the assignment to:
new_name=$( echo ${file} | sed -e 's|.ts|.mkv|' )
But a better solution would be to do:
new_name="${file%.ts}.mkv"
The simplest solution would be to tell you to change the assignment to:
new_name=$( echo ${file} | sed -e 's|.ts|.mkv|' )
But a better solution would be to do:
new_name="${file%.ts}.mkv"
answered Jan 28 at 3:12
IsaacIsaac
11.8k11752
11.8k11752
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in"${1}"/*.tsI don't see how a.mkvfile gets in the list. @NasKar
– Isaac
Jan 29 at 6:28
add a comment |
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in"${1}"/*.tsI don't see how a.mkvfile gets in the list. @NasKar
– Isaac
Jan 29 at 6:28
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
the 1st option works the second give file.mkv/*.mkv
– NasKar
Jan 29 at 3:16
If the loop is applied only to files in
"${1}"/*.ts I don't see how a .mkv file gets in the list. @NasKar– Isaac
Jan 29 at 6:28
If the loop is applied only to files in
"${1}"/*.ts I don't see how a .mkv file gets in the list. @NasKar– Isaac
Jan 29 at 6:28
add a comment |
find . -maxdepth 1 -type f -name '*.ts' -exec rename .ts .mkv {} "+"
Run this in the directory containing the .ts files.
add a comment |
find . -maxdepth 1 -type f -name '*.ts' -exec rename .ts .mkv {} "+"
Run this in the directory containing the .ts files.
add a comment |
find . -maxdepth 1 -type f -name '*.ts' -exec rename .ts .mkv {} "+"
Run this in the directory containing the .ts files.
find . -maxdepth 1 -type f -name '*.ts' -exec rename .ts .mkv {} "+"
Run this in the directory containing the .ts files.
answered Jan 28 at 5:13
Niko GambtNiko Gambt
1836
1836
add a comment |
add a comment |
#!/bin/sh
for file in "${1}"/*.ts; do
mv "${file}" "$(basename "${file}").mkv"
done
add a comment |
#!/bin/sh
for file in "${1}"/*.ts; do
mv "${file}" "$(basename "${file}").mkv"
done
add a comment |
#!/bin/sh
for file in "${1}"/*.ts; do
mv "${file}" "$(basename "${file}").mkv"
done
#!/bin/sh
for file in "${1}"/*.ts; do
mv "${file}" "$(basename "${file}").mkv"
done
answered Jan 28 at 3:28
nyetnyet
13113
13113
add a comment |
add a comment |
rename is what you're looking for :
rename '.ts' '.mkv' "${1}/*.ts"
add a comment |
rename is what you're looking for :
rename '.ts' '.mkv' "${1}/*.ts"
add a comment |
rename is what you're looking for :
rename '.ts' '.mkv' "${1}/*.ts"
rename is what you're looking for :
rename '.ts' '.mkv' "${1}/*.ts"
answered Jan 28 at 8:24
breversabreversa
1115
1115
add a comment |
add a comment |
By using $file unquoted in your code, you invite the shell to split its contents into words based on the value of $IFS (space, tab and newline by default). Those words would then undergo filename expansion if they contained any globbing patterns.
By using echo, you would possibly also expand backslash sequences like n and t depending on what shell options happened to be set (xpg_echo).
Your first sed command would replace any character followed by ts in the filename with .mkv. This means that the filename bats.ts would be changed to b.mkv.ts.
The second line in the loop is nonsensical, as it takes the output of an assignment and passes it to sed over a pipe.
Assigning the output of a command to a variable is done with command substitutions:
variable=$( some_command )
#!/bin/sh
for name in "$1"/*.ts; do
mv -i "$name" "${name%.ts}.mkv"
done
This would loop over all files having a filename suffix of .ts in the directory given by "$1". Each file would be renamed to the same name, but with the .ts filename suffix removed and the .mkv suffix inserted at the end of the filename.
The variable substitution ${variable%pattern} would remove the shortest suffix in $variable that matches pattern. This would work even if the filename happened to contain embedded newlines.
By using mv -i we hopefully prevent the function from accidentally overwriting existing files. Another way to do that would be to do something like
#!/bin/sh
for name in "$1"/*.ts; do
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In addition to this test, you may actually want to check whether $name exists to start with. If the pattern "$1"/.*ts does not match any filenames, then it would by default remain unexpanded. We can catch that with
#!/bin/sh
for name in "$1"/*.ts; do
[ ! -e "$name" ] && break
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In the bash shell, you could use shopt -s nullglob to make nonmatching patterns expand to nothing instead. In bash you may also want to use shopt -s dotglob if you want to additionally match hidden filenames.
add a comment |
By using $file unquoted in your code, you invite the shell to split its contents into words based on the value of $IFS (space, tab and newline by default). Those words would then undergo filename expansion if they contained any globbing patterns.
By using echo, you would possibly also expand backslash sequences like n and t depending on what shell options happened to be set (xpg_echo).
Your first sed command would replace any character followed by ts in the filename with .mkv. This means that the filename bats.ts would be changed to b.mkv.ts.
The second line in the loop is nonsensical, as it takes the output of an assignment and passes it to sed over a pipe.
Assigning the output of a command to a variable is done with command substitutions:
variable=$( some_command )
#!/bin/sh
for name in "$1"/*.ts; do
mv -i "$name" "${name%.ts}.mkv"
done
This would loop over all files having a filename suffix of .ts in the directory given by "$1". Each file would be renamed to the same name, but with the .ts filename suffix removed and the .mkv suffix inserted at the end of the filename.
The variable substitution ${variable%pattern} would remove the shortest suffix in $variable that matches pattern. This would work even if the filename happened to contain embedded newlines.
By using mv -i we hopefully prevent the function from accidentally overwriting existing files. Another way to do that would be to do something like
#!/bin/sh
for name in "$1"/*.ts; do
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In addition to this test, you may actually want to check whether $name exists to start with. If the pattern "$1"/.*ts does not match any filenames, then it would by default remain unexpanded. We can catch that with
#!/bin/sh
for name in "$1"/*.ts; do
[ ! -e "$name" ] && break
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In the bash shell, you could use shopt -s nullglob to make nonmatching patterns expand to nothing instead. In bash you may also want to use shopt -s dotglob if you want to additionally match hidden filenames.
add a comment |
By using $file unquoted in your code, you invite the shell to split its contents into words based on the value of $IFS (space, tab and newline by default). Those words would then undergo filename expansion if they contained any globbing patterns.
By using echo, you would possibly also expand backslash sequences like n and t depending on what shell options happened to be set (xpg_echo).
Your first sed command would replace any character followed by ts in the filename with .mkv. This means that the filename bats.ts would be changed to b.mkv.ts.
The second line in the loop is nonsensical, as it takes the output of an assignment and passes it to sed over a pipe.
Assigning the output of a command to a variable is done with command substitutions:
variable=$( some_command )
#!/bin/sh
for name in "$1"/*.ts; do
mv -i "$name" "${name%.ts}.mkv"
done
This would loop over all files having a filename suffix of .ts in the directory given by "$1". Each file would be renamed to the same name, but with the .ts filename suffix removed and the .mkv suffix inserted at the end of the filename.
The variable substitution ${variable%pattern} would remove the shortest suffix in $variable that matches pattern. This would work even if the filename happened to contain embedded newlines.
By using mv -i we hopefully prevent the function from accidentally overwriting existing files. Another way to do that would be to do something like
#!/bin/sh
for name in "$1"/*.ts; do
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In addition to this test, you may actually want to check whether $name exists to start with. If the pattern "$1"/.*ts does not match any filenames, then it would by default remain unexpanded. We can catch that with
#!/bin/sh
for name in "$1"/*.ts; do
[ ! -e "$name" ] && break
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In the bash shell, you could use shopt -s nullglob to make nonmatching patterns expand to nothing instead. In bash you may also want to use shopt -s dotglob if you want to additionally match hidden filenames.
By using $file unquoted in your code, you invite the shell to split its contents into words based on the value of $IFS (space, tab and newline by default). Those words would then undergo filename expansion if they contained any globbing patterns.
By using echo, you would possibly also expand backslash sequences like n and t depending on what shell options happened to be set (xpg_echo).
Your first sed command would replace any character followed by ts in the filename with .mkv. This means that the filename bats.ts would be changed to b.mkv.ts.
The second line in the loop is nonsensical, as it takes the output of an assignment and passes it to sed over a pipe.
Assigning the output of a command to a variable is done with command substitutions:
variable=$( some_command )
#!/bin/sh
for name in "$1"/*.ts; do
mv -i "$name" "${name%.ts}.mkv"
done
This would loop over all files having a filename suffix of .ts in the directory given by "$1". Each file would be renamed to the same name, but with the .ts filename suffix removed and the .mkv suffix inserted at the end of the filename.
The variable substitution ${variable%pattern} would remove the shortest suffix in $variable that matches pattern. This would work even if the filename happened to contain embedded newlines.
By using mv -i we hopefully prevent the function from accidentally overwriting existing files. Another way to do that would be to do something like
#!/bin/sh
for name in "$1"/*.ts; do
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In addition to this test, you may actually want to check whether $name exists to start with. If the pattern "$1"/.*ts does not match any filenames, then it would by default remain unexpanded. We can catch that with
#!/bin/sh
for name in "$1"/*.ts; do
[ ! -e "$name" ] && break
newname=${name%.ts}.mkv
if [ ! -e "$newname" ]; then
mv "$name" "$newname"
else
printf 'Name "%s" is already takenn' "$newname" >&2
fi
done
In the bash shell, you could use shopt -s nullglob to make nonmatching patterns expand to nothing instead. In bash you may also want to use shopt -s dotglob if you want to additionally match hidden filenames.
edited Jan 28 at 8:54
answered Jan 28 at 8:31
KusalanandaKusalananda
128k16241398
128k16241398
add a comment |
add a comment |
2
Just use
rename. If the Perl version, it's justrename 's/.ts$/.mkv' *.– Sparhawk
Jan 28 at 1:38
I want to save the renamed file to a variable to pass in another command in the script (input name -> output name). The examples are for renaming them in the directory
– NasKar
Jan 28 at 3:22
1
Please edit your question to include this information.
– Sparhawk
Jan 28 at 3:39
Are your files named with
.tsactually Matroska files? Why are they all misnamed?– jamesdlin
Jan 28 at 5:57