Bash 将文件夹中的所有文件名以及每个名称后的一些文本列出到txt文件中的脚本

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

我需要创建一个文件,将文件夹中的所有文件列成一个文本文件,并在文件后面加上逗号和数字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>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*的