更改多个文件名 unix
Change multiple filenames unix
我不得不下载 15GB 的数据,由于某种原因,在下载过程中文件名被弄乱了,所以
test_file.txt
文件名加倍,所以是
test_file.txttest_file.txt
相反。我唯一的想法是,是否有任何方法可以计算字母数量,然后通过删除文件名的前半部分或后半部分来重命名每个文件?文件名不一致,例如在同一个文件夹中可能还有名为
的文件
files_are_great.txtfiles_are_great.txt
所以我正在努力寻找循环遍历它们的方法。
非常感谢!
使用 sed
sed 's#\(\.txt\)#& #g'
说明:使用 \( \)
我们将可以使用 &
访问的表达式分组
演示:
echo "files_are_great.txtfiles_are_great.txt" | sed 's#\(\.txt\)#& #g'
files_are_great.txt files_are_great.txt
重命名:
for file_name in $(ls -1 *txt*txt)
do
new_file_name=$(echo $i |sed 's#\(\.txt\)#& #g' | cut -d' ' -f1)
mv $file_name $new_file_name
done
命令 sed 's/\(.*\)//'
将用单个字符串替换所有重复的字符串,而不需要文件名的特定部分,如 .txt
。它允许字符串中有空格。
示例:
echo 'abc defabc def' | sed 's/^\(.*\)$//'
打印
abc def
sed
命令的解释:
^
将模式锚定到行首
.*
是任意字符出现 0 次或多次
\(
...\)
捕获与 之间的模式相匹配的内容
</code> 是对第一个捕获组的引用,即之前找到的文本</li>
<li><code>$
将搜索模式锚定到行尾
这会导致搜索模式匹配整行,该整行由任何文本后跟相同的文本组成。
替换中的 </code> 是对匹配文本的相同引用,即重复文本的一次出现。</li>
</ul>
<p>任何与模式不匹配的输入都将保持不变。</p>
<p>假设你想重命名当前目录中的所有文件,你可以像这样使用它</p>
<pre><code>for file in *
do
new=$(echo $file|sed 's/\(.*\)//')
[ "$file" = "$new" ] || mv "$file" "$new"
done
由于 sed
命令不会更改不匹配的输入,对于不包含重复字符串的文件名,$new
将与 $file
相同。这将导致来自 mv
的错误消息。这就是为什么在这种情况下将跳过重命名。
我不得不下载 15GB 的数据,由于某种原因,在下载过程中文件名被弄乱了,所以
test_file.txt
文件名加倍,所以是
test_file.txttest_file.txt
相反。我唯一的想法是,是否有任何方法可以计算字母数量,然后通过删除文件名的前半部分或后半部分来重命名每个文件?文件名不一致,例如在同一个文件夹中可能还有名为
的文件files_are_great.txtfiles_are_great.txt
所以我正在努力寻找循环遍历它们的方法。
非常感谢!
使用 sed
sed 's#\(\.txt\)#& #g'
说明:使用 \( \)
我们将可以使用 &
演示:
echo "files_are_great.txtfiles_are_great.txt" | sed 's#\(\.txt\)#& #g'
files_are_great.txt files_are_great.txt
重命名:
for file_name in $(ls -1 *txt*txt)
do
new_file_name=$(echo $i |sed 's#\(\.txt\)#& #g' | cut -d' ' -f1)
mv $file_name $new_file_name
done
命令 sed 's/\(.*\)//'
将用单个字符串替换所有重复的字符串,而不需要文件名的特定部分,如 .txt
。它允许字符串中有空格。
示例:
echo 'abc defabc def' | sed 's/^\(.*\)$//'
打印
abc def
sed
命令的解释:
^
将模式锚定到行首.*
是任意字符出现 0 次或多次\(
...\)
捕获与 之间的模式相匹配的内容
</code> 是对第一个捕获组的引用,即之前找到的文本</li> <li><code>$
将搜索模式锚定到行尾
这会导致搜索模式匹配整行,该整行由任何文本后跟相同的文本组成。
-
替换中的
</code> 是对匹配文本的相同引用,即重复文本的一次出现。</li> </ul> <p>任何与模式不匹配的输入都将保持不变。</p> <p>假设你想重命名当前目录中的所有文件,你可以像这样使用它</p> <pre><code>for file in * do new=$(echo $file|sed 's/\(.*\)//') [ "$file" = "$new" ] || mv "$file" "$new" done
由于
sed
命令不会更改不匹配的输入,对于不包含重复字符串的文件名,$new
将与$file
相同。这将导致来自mv
的错误消息。这就是为什么在这种情况下将跳过重命名。