This should do it:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
I prefer to use the command 'rename', which takes Perl-style regexes:
rename "s/ /_/g" *
You can do a dry run with the -n flag:
rename -n "s/ /_/g" *
rename " " "_" *
rename
not available in OSX it appears.
rename
is available.
Use sh...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
If you want to try this out before pulling the trigger just change mv
to echo mv
.
If you use bash:
for file in *; do mv "$file" ${file// /_}; done
mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try
mv --help' for more information.
mv --help' for more information. mv: missing file argument Try
mv --help' for more information. mv: missing file argument Try mv --help' for more information. mv: missing file argument Try
mv --help' for more information.
What if you want to apply the replace task recursively? How would you do that?
Well, I just found the answer myself. Not the most elegant solution, (also tries to rename files that do not comply with the condition) but it works. (BTW, in my case I needed to rename the files with '%20', not with an underscore)
#!/bin/bash
find . -type d | while read N
do
(
cd "$N"
if test "$?" = "0"
then
for file in *; do mv "$file" ${file// /%20}; done
fi
)
done
Here is another solution:
ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
uses awk to add quotes around the name of the file uses sed to replace space with underscores; prints the original name with quotes(from awk); then the substituted name xargs takes 2 lines at a time and passes it to mv
Try something like this, assuming all of your files were .txt's:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
tr --help' for more information. mv: missing file argument Try
mv --help' for more information.
Quote your variables:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Remove the "echo" to do the actual rename.
\'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat
\'1130_1_bedroom_floor_plan.jpg\'': No such file or directory mv: cannot stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat
\'1130_diningroom_table.jpg\'': No such file or directory
To rename all the files with a .py
extension use, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
Sample output,
$ find . -iname "*.py" -type f
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f
./Sample/Sample_File.py
./Sample_File.py
This will replace ' '
with '_'
in every folder and file name recursivelly in Linux with Python >= 3.5. Change path_to_your_folder
with your path.
Only list files and folders:
python -c "import glob;[print(x) for x in glob.glob('path_to_your_folder/**', recursive=True)]"
Replace ' '
with '_'
in every folder and file name
python -c "import os;import glob;[os.rename(x,x.replace(' ','_')) for x in glob.glob('path_to_your_folder/**', recursive=True)]"
With Python < 3.5, you can install glob2
pip install glob2
python -c "import os;import glob2;[os.rename(x,x.replace(' ','_')) for x in glob2.glob('path_to_your_folder/**')]"
The easiest way to replace a string (space character in your case) with another string in Linux
is using sed
. You can do it as follows
sed -i 's/\s/_/g' *
Hope this helps.
Success story sharing
1 - foo.jpg
and my folder already had1.jpg
in it.for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
*
toPATH_TO_YOUR_DIRECTORY
.