Bash 将文件夹中的所有文件名以及每个名称后的一些文本列出到txt文件中的脚本
我需要创建一个文件,将文件夹中的所有文件列成一个文本文件,并在文件后面加上逗号和数字15。比如说 我的文件夹有Bash 将文件夹中的所有文件名以及每个名称后的一些文本列出到txt文件中的脚本,bash,Bash,我需要创建一个文件,将文件夹中的所有文件列成一个文本文件,并在文件后面加上逗号和数字15。比如说 我的文件夹有video.mp4、video2.mp4、picture1.jpg、picture2.jpg、picture3.png 我需要文本文件如下所示: video.mp4,15 video2.mp4,15 picture1.jpg,15 picture2.jpg,15 picture3.png,15 没有空格,只有filename.ext,每行15个。我用的是覆盆子皮。我知道命令ls>fil
video.mp4、video2.mp4、picture1.jpg、picture2.jpg、picture3.png
我需要文本文件如下所示:
video.mp4,15
video2.mp4,15
picture1.jpg,15
picture2.jpg,15
picture3.png,15
没有空格,只有filename.ext,每行15个
。我用的是覆盆子皮。我知道命令ls>filename.txt
会将所有文件名放在一个文件夹中,但是如何在每行之后得到一个,15
谢谢您需要这样做:
#!/bin/bash
for i in $(ls folder_name); do
echo $i",15" >> filename.txt;
done
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15";
done > filename.txt
可以在一行中实现这一点,但是,如果你想创建一个脚本,从长远来看考虑代码可读性。
编辑1:更好的解决方案
正如@CristianRamon Cortes在下面的评论中所建议的,您不应该依赖ls
的输出,因为本讨论中解释了以下问题:。因此,以下是您应该如何编写脚本:
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15" >> filename.txt;
done
如果您已经在该文件夹中,则可以跳过零件cd文件夹\u name
编辑2:增强型解决方案:
正如@kusalanda所建议的,您最好在完成后进行重定向,以避免在for循环的每次迭代中打开文件,因此脚本如下所示:
#!/bin/bash
for i in $(ls folder_name); do
echo $i",15" >> filename.txt;
done
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15";
done > filename.txt
您需要这样做:
#!/bin/bash
for i in $(ls folder_name); do
echo $i",15" >> filename.txt;
done
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15";
done > filename.txt
可以在一行中实现这一点,但是,如果你想创建一个脚本,从长远来看考虑代码可读性。
编辑1:更好的解决方案
正如@CristianRamon Cortes在下面的评论中所建议的,您不应该依赖ls
的输出,因为本讨论中解释了以下问题:。因此,以下是您应该如何编写脚本:
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15" >> filename.txt;
done
如果您已经在该文件夹中,则可以跳过零件cd文件夹\u name
编辑2:增强型解决方案:
正如@kusalanda所建议的,您最好在完成后进行重定向,以避免在for循环的每次迭代中打开文件,因此脚本如下所示:
#!/bin/bash
for i in $(ls folder_name); do
echo $i",15" >> filename.txt;
done
#!/bin/bash
cd folder_name
for i in *; do
echo $i",15";
done > filename.txt
bash一行:
为了避免在每次迭代时打开输出文件,可以使用
>filename.txt
重定向整个输出:
for f in *; do echo "$f,15"; done > filename.txt
bash一行:
为了避免在每次迭代时打开输出文件,可以使用
>filename.txt
重定向整个输出:
for f in *; do echo "$f,15"; done > filename.txt
没有循环的解决方案:
ls | xargs -i echo {},15 > filename.txt
没有循环的解决方案:
ls | xargs -i echo {},15 > filename.txt
只需使用2个msr命令重复(
-r
)搜索特定文件的1个命令行:
msr-rp-your-dir1,dir2,dirN-l-f“\(mp4 | jpg | png)$”-PAC | msr-t.+-o'$0,15'-PIC>save file.txt
- 如果要按时间排序,请将
添加到第一个命令,如:--wt
msr--wt-l-rp您的dirs
- 按大小排序?添加
,但如果同时使用--sz
和--sz
,则只有前一个有效--wt
- 如果要排除某些目录,请添加如下内容:
--nd“^(测试|垃圾)$”
- 在
中删除尾部save file.txt
:\r\n
msr-p save-file.txt-S-t“\S+$”-o”“-r
请参阅我打开的项目
tools
目录中的msr.exe
/msr.gcc48
等。只需使用2个msr
命令循环使用1个命令行(-r
)搜索特定文件:
$ printf '%s,15\n' *
picture1.jpg,15
picture2.jpg,15
picture3.png,15
video.mp4,15
video2.mp4,15
msr-rp-your-dir1,dir2,dirN-l-f“\(mp4 | jpg | png)$”-PAC | msr-t.+-o'$0,15'-PIC>save file.txt
- 如果要按时间排序,请将
添加到第一个命令,如:--wt
msr--wt-l-rp您的dirs
- 按大小排序?添加
,但如果同时使用--sz
和--sz
,则只有前一个有效--wt
- 如果要排除某些目录,请添加如下内容:
--nd“^(测试|垃圾)$”
- 在
中删除尾部save file.txt
:\r\n
msr-p save-file.txt-S-t“\S+$”-o”“-r
msr.exe
/msr.gcc48
etc
$ printf '%s,15\n' *
picture1.jpg,15
picture2.jpg,15
picture3.png,15
video.mp4,15
video2.mp4,15
如果这些是目录中唯一的文件,这将起作用。格式说明符%s,15\n
将应用于printf
的每个参数(当前目录中的名称),并在输出时附加,15
(和换行符)
如果还有其他文件,则无论是否有这样调用的文件,以下操作也会起作用:
$ printf '%s,15\n' video.mp4 video2.mp4 picture1.jpg picture2.jpg "whatever this is"
video.mp4,15
video2.mp4,15
picture1.jpg,15
picture2.jpg,15
whatever this is,15
或者,在所有MP4、PNG和JPEG文件上:
$ printf '%s,15\n' *.mp4 *.jpg *.png
video.mp4,15
video2.mp4,15
picture1.jpg,15
picture2.jpg,15
picture3.png,15
然后将其重定向到带有printf…的文件,如上所述…>output.txt
如果您使用的是Bash,那么它将不会使用任何外部实用程序,因为printf
内置于shell中
如果这些是目录中唯一的文件,这将起作用。格式说明符%s,15\n
将应用于printf
的每个参数(当前目录中的名称),并在输出时附加,15
(和换行符)
如果还有其他文件,则无论是否有这样调用的文件,以下操作也会起作用:
$ printf '%s,15\n' video.mp4 video2.mp4 picture1.jpg picture2.jpg "whatever this is"
video.mp4,15
video2.mp4,15
picture1.jpg,15
picture2.jpg,15
whatever this is,15
或者,在所有MP4、PNG和JPEG文件上:
$ printf '%s,15\n' *.mp4 *.jpg *.png
video.mp4,15
video2.mp4,15
picture1.jpg,15
picture2.jpg,15
picture3.png,15
然后将其重定向到带有printf…的文件,如上所述…>output.txt
如果您使用的是Bash,则不会使用任何外部实用程序,因为
printf
内置于shell中。使用Bash
时,不应依赖ls
输出。请看@RomanPerekhrest答案。@CristianRamon Cortes为什么?有例子吗?基本问题是UNIX允许几乎任何字符作为文件名,包括空格、新行、制表符等。因此,在解析ls输出时,可以拆分文件名。你可以在这里找到一个扩展和精确的信息:你可以更新你的答案,提供i in*的鳕鱼