更改 bash 中具有特殊字符的文件名
Changing filenames that have special characters in bash
我们是 运行 一个 Ubuntu 服务器,可以自动通过 FTP 传输来自客户的文件,这些文件最近显示为...
'file.csv;'
'file2.csv;
我一直在尝试制定 bash 和 Python 解决方案,但运气不佳。我只是想去掉单引号和分号并保留剩下的。这不一定是 bash,它可以是 python 甚至 perl。我在下面包含了不起作用的代码。我什至无法获得目录列表。谁能指出我正确的方向?
for i in \'*
do
echo $i
done
注意:已更正代码以删除错误的 $echo'
像这样使用find ... -exec rename
:
find . -name "*[;']*" -exec rename "tr/';//d" {} \;
示例:
# Create example input files:
$ touch "f'o''o'" "b;a;;r;" "b';a;'';z;'"
# Build the command by first confirming that `find` finds them all:
$ find . -name "*[;']*"
./f'o''o'
./b';a;'';z;'
./b;a;;r;
# Find and rename them, one by one:
$ find . -name "*[;']*" -exec rename "tr/';//d" {} \;
# Confirm that rename worked as expected:
$ ls -1rt | tail -n 3
foo
bar
baz
您也可以使用 xargs
进行批量重命名以提高速度,例如
find ... -print0 | xargs -0 ...
但在你的情况下,我认为一个一个地重命名文件已经足够快了。
command-line 实用程序 rename
有多种形式。他们中的大多数人应该为这项任务工作。我使用了 Aristotle Pagaltzis 的 rename
版本 1.601。要安装 rename
,只需下载其 Perl 脚本并将其放入 $PATH
。或者使用 conda
安装 rename
,像这样:
conda install rename
import os
filesInDirectory = os.listdir(Path)
for filename in filesInDirectory:
if "'" in filename:
filename.replace("'", "")
elif ";" in filename:
filename.replace(";", "")
elif ("'" and ";") in filename:
filename.replace("'", "")
filename.replace(";", "")
使用Python
您可以先试试这个 python 3 脚本。不过我只在 Windows 中测试过它。
import os
folder = ""
for root, dirs, files in os.walk(folder, topdown=False):
for fn in files:
path_to_file = os.path.join(root, fn)
if "'" in fn or ";" in fn:
print('Removing special characters from file: ' + fn)
new_name = fn.replace("'", '').replace(";", '')
os.rename(path_to_file, os.path.join(root, new_name))
我们是 运行 一个 Ubuntu 服务器,可以自动通过 FTP 传输来自客户的文件,这些文件最近显示为... 'file.csv;' 'file2.csv;
我一直在尝试制定 bash 和 Python 解决方案,但运气不佳。我只是想去掉单引号和分号并保留剩下的。这不一定是 bash,它可以是 python 甚至 perl。我在下面包含了不起作用的代码。我什至无法获得目录列表。谁能指出我正确的方向?
for i in \'*
do
echo $i
done
注意:已更正代码以删除错误的 $echo'
像这样使用find ... -exec rename
:
find . -name "*[;']*" -exec rename "tr/';//d" {} \;
示例:
# Create example input files:
$ touch "f'o''o'" "b;a;;r;" "b';a;'';z;'"
# Build the command by first confirming that `find` finds them all:
$ find . -name "*[;']*"
./f'o''o'
./b';a;'';z;'
./b;a;;r;
# Find and rename them, one by one:
$ find . -name "*[;']*" -exec rename "tr/';//d" {} \;
# Confirm that rename worked as expected:
$ ls -1rt | tail -n 3
foo
bar
baz
您也可以使用 xargs
进行批量重命名以提高速度,例如
find ... -print0 | xargs -0 ...
但在你的情况下,我认为一个一个地重命名文件已经足够快了。
command-line 实用程序 rename
有多种形式。他们中的大多数人应该为这项任务工作。我使用了 Aristotle Pagaltzis 的 rename
版本 1.601。要安装 rename
,只需下载其 Perl 脚本并将其放入 $PATH
。或者使用 conda
安装 rename
,像这样:
conda install rename
import os
filesInDirectory = os.listdir(Path)
for filename in filesInDirectory:
if "'" in filename:
filename.replace("'", "")
elif ";" in filename:
filename.replace(";", "")
elif ("'" and ";") in filename:
filename.replace("'", "")
filename.replace(";", "")
使用Python
您可以先试试这个 python 3 脚本。不过我只在 Windows 中测试过它。
import os
folder = ""
for root, dirs, files in os.walk(folder, topdown=False):
for fn in files:
path_to_file = os.path.join(root, fn)
if "'" in fn or ";" in fn:
print('Removing special characters from file: ' + fn)
new_name = fn.replace("'", '').replace(";", '')
os.rename(path_to_file, os.path.join(root, new_name))