我在文件夹中有一些文件(扩展名为 *.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/