ios - 如何制作文件夹中的文件列表并通过终端将此列表中的每一行粘贴到 *.plist 中?

标签 ios bash command-line terminal

我在文件夹中有一些文件(扩展名为 *.m4r) 我需要将它们的每个名称复制到另一个名称(扩展名为 *.plist)。

例如,

Folder=/Library/Ringtones

该文件夹中的文件:

 - name_of_first_file.m4r
 - name_of_second_file.m4r
 - name_of_third_file.m4r

Plist(我们应该在其中添加此文件的名称):

Plist=/System/Library/PrivateFrameworks/ToneKit.framework/TKRingtones.plist

这就是我需要在此 plist 文件末尾拥有的内容:

<string>system:name_of_first_file</string>
<string>system:name_of_second_file</string>
<string>system:name_of_third_file</string>

我也不知道文件夹中有多少文件。 里面可以有1个、2个,甚至100个!

能否请您告诉我如何在终端中使用 bash 来做到这一点! 谢谢!


John1024的回答

此代码有效。谢谢

     #!/bin/bash
     cd /Library/Ringtones
     Plist="/System/Library/PrivateFrameworks/ToneKit.framework/TKRingtones.plist"
     for file in *.m4r; do printf '<string>system:%s</string>\n' "$file" ; done >>"$Plist"
     exit 0

我还有一个问题。

1 这是库存 plist TKRingtones.plist (/System/Library/PrivateFrameworks/ToneKit.framework/)

     <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
     <plist version="1.0">
     <dict>
        <key>classic</key>
        <array>
            <string>system:unlock</string>
            <string>system:Alarm</string>
            <string>system:Ascending</string>
        </array>
        <key>modern</key>
        <array>
            <string>system:Apex</string>
            <string>system:Beacon</string>
        </array>
        <key>sort</key>
        <true/>
     </dict>
     </plist>

如何让脚本(您建议的)将字符串粘贴到数组之后?

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>classic</key>
        <array>
    <string>system:NAME_OF_FIRST_FILE</string> <<<<<<<<<<<<<<<ADD HERE 
    <string>system:NAME_OF_SECONDS_FILE</string> <<<<<<<<<<<<<<<ADD HERE
    <string>system:NAME_OF_THIRD_FILE</string> <<<<<<<<<<<<<<<ADD HERE
            <string>system:unlock</string>
            <string>system:Alarm</string>
            <string>system:Ascending</string>
        </array>
        <key>modern</key>
        <array>
            <string>system:Apex</string>
            <string>system:Beacon</string>
        </array>
        <key>sort</key>
        <true/>
    </dict>
    </plist>

最佳答案

for file in *.m4r; do printf '<string>system:%s</string>\n' "$file" ; done >>"$Plist"

输出如下:

<string>system:name_of_first_file.m4r</string>
<string>system:name_of_second_file.m4r</string>
<string>system:name_of_third_file.m4r</string>

解释

  • for file in *.m4r; do

    这将开始循环遍历当前目录中名称以 .m4r 结尾的每个文件.

    即使文件名包含空格、制表符或其他难以理解的字符,此循环也会起作用。

  • printf '<string>system:%s</string>\n' "$file"

    这会打印我们想要的包含文件名的字符串。

  • done

    这标志着 for 的结束循环。

  • >>"$Plist"

    这会导致此循环的所有输出附加到由 Plist 命名的文件中外壳变量。

修改问题的答案

此循环遍历 Plist 文件,直到找到 <array>行,然后写出新值(就像我们上面所做的那样),然后完成复制 Plist 文件:

while IFS= read -r line
do
    printf "%s\n" "$line"
    case "$line" in
        *"<array>"*)
            for file in *.m4r
            do_
                printf '       <string>system:%s</string>\n' "$file"
            done
            ;;
    esac
done >"$Plist.tmp" <"$Plist"
mv "$Plist.tmp" "$Plist"

这应该适用于任何 POSIX shell。

关于ios - 如何制作文件夹中的文件列表并通过终端将此列表中的每一行粘贴到 *.plist 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26815013/

相关文章:

ios - 重新加载表时关闭 UISwipeActionsConfiguration

node.js - 在 "npm start"中使用 ~/.bashrc 中的环境变量?

bash - 如何在 bash printf 的格式字符串中包含破折号?

amazon-web-services - AWS S3 CLI : Anonymous users cannot initiate multipart uploads

ios - Google Drive API (GTL) - 按顺序创建多个文件夹路径?

ios - 将点击手势添加到 tableview 使得放置在表头 View 中的 UICollectionView 单元格不可选择

iphone - JSONKit 给出解析错误,但 JSONLint.org 表示它是有效的

bash - 如何在 Linux 系统上将多个二进制文件复制到一个文件中?

java - 从命令行生成 SVG 失败,但使用 NetBeans 生成成功

c++ - 命令行参数不是 incrementinc argc