Arrays 将每个包含文件路径的两个数组区分为第三个数组(用于删除)
在下面的函数中,您将看到关于解决此问题的几种尝试的注释;每一次尝试都会有一个提示,指出哪里出了问题。在我的两次尝试之间,有一条线来自另一个问题,该问题旨在解决问题的某些方面。再一次,我添加了一个注释,指出应该解决什么问题。我的大脑在这一点上是糊状的。我忽略的最简单的愚蠢的事情是什么Arrays 将每个包含文件路径的两个数组区分为第三个数组(用于删除),arrays,bash,Arrays,Bash,在下面的函数中,您将看到关于解决此问题的几种尝试的注释;每一次尝试都会有一个提示,指出哪里出了问题。在我的两次尝试之间,有一条线来自另一个问题,该问题旨在解决问题的某些方面。再一次,我添加了一个注释,指出应该解决什么问题。我的大脑在这一点上是糊状的。我忽略的最简单的愚蠢的事情是什么 function func_removeDestinationOrphans() { readarray -d '' A_Destination_orphans < <( find "
function func_removeDestinationOrphans() {
readarray -d '' A_Destination_orphans < <( find "${directory_PMPRoot_destination}" -type f -print0 )
for (( i = 0 ; i < ${#A_Destination_orphans[@]} ; i++ )) ; do
printf '%s\n' "→ ${A_Destination_orphans[${i}]}" # path to each track
done
printf '%b\n' ""
# https://stackoverflow.com/questions/2312762/compare-difference-of-two-arrays-in-bash
# echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u ## original
# Array3=(`echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u `) ## store in array
# A_Destination_orphans_diff=(`echo "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" | tr ' ' '\n' | sort | uniq -u `) # drops file path after space
# printf "%s\0" "${Array1[@]}" "${Array2[@]}" | sort -z | uniq -zu ## newlines and white spaces
# A_Destination_orphans_diff=($( printf "%s\0" "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" | sort -z | uniq -zu )) # throws warning and breaks at space but not newline
# printf '%s\n' "${Array1[@]}" "${Array2[@]}" | sort | uniq -u ## manage spaces
# A_Destination_orphans_diff=($( printf '%s\n' "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" | sort | uniq -u )) # breaks at space and newline
# A_Destination_orphans_diff="($( printf '%s\n' "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" | sort | uniq -u ))" # creates string surrounded by ()
# A_Destination_orphans_diff=("$( printf '%s\n' "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" | sort | uniq -u )") # creates string
# A_Destination_orphans_diff=($( printf '%s\n' ${A_Destination_dubUnders[@]} ${A_Destination_orphans[@]} | sort | uniq -u )) # drops file path after space
for (( i = 0 ; i < ${#A_Destination_orphans_diff[@]} ; i++ )) ; do
printf '%s\n' "→ ${A_Destination_orphans_diff[${i}]}" # path to each track
done
printf '%b\n' ""
for (( i = 0 ; i < ${#A_Destination_orphans_diff[@]} ; i++ )) ; do
echo # rm "${A_Destination_orphans_diff[i]}"
done
func_EnterToContinue
}
函数func_removedestimationorphans(){
readarray-d“”A_Destination_孤儿<这会引发警告并在空格处中断,但不会换行,因为您使用语法构造的直接赋值来构建数组。当条目包含空格时,它还会将中断拆分为新条目
A_Destination_obliens_diff=($(printf“%s\0”${A_Destination_dubUnders[@]}“${A_Destination_obliens[@]}”| sort-z | uniq-zu))
为了避免上述方法的问题,您可以mapfile
/readarray
anull
分隔条目流
mapfile-t-d''A_Destination_孤儿_diff<要删除A_Destination_dubUnders
数组中不存在的所有文件,您可以:
func_removeDestinationOrphans() {
find "${directory_PMPRoot_destination}" -type f -print0 |
sort -z |
join -z -v1 -t '' - <(printf "%s\0" "${A_Destination_dubUnders[@]}" | sort -z) |
xargs -0 echo rm
}
func_removedestimationorphans(){
查找“${directory\u PMPRoot\u destination}”-类型f-print0|
排序-z|
join-z-v1-t''-这是经过修改的工作版本,感谢前两位受访者的建议输入(谢谢!)
函数func_removedestimationorphans(){
printf“%s\n”→ 清除播放列表孤立项:“”
printf“%b\n”首先,我们将删除您建议的播放列表中不存在的任何文件
继续营业
bash|u version=“$(bash--version | head-n1 | cut-d”“-f4 | cut-d”(“-f1)”
如果printf'%s\n'“4.4.0”“${bash_version}”| sort-V-C;那么
readarray-d''A_Destination_孤儿<这似乎是合法的。我在其他地方使用过类似的mapfile/readarray用于不同的目的,这里的输出似乎检查正确。你会说,该线程中的那些贡献者完全错了,需要重定向?他们似乎对自己很有把握。该死,这台机器是用于同步运行的是一个较旧的带有bash 4.3.xx的Ubu。抱歉,该\37版本似乎不适合我。我已在上面添加了我的函数的第二个版本(现在是最新版本)。
function func_removeDestinationOrphans() {
printf '%s\n' " → Purge playlist orphans: " ""
printf '%b\n' "First we will remove any files not present in your proposed playlist. "
func_EnterToContinue
bash_version="$( bash --version | head -n1 | cut -d " " -f4 | cut -d "(" -f1 )"
if printf '%s\n' "4.4.0" "${bash_version}" | sort -V -C ; then
readarray -d '' A_Destination_orphans < <( find "${directory_PMPRoot_destination}" -type f -print0 ) # readarray or mapfile -d fails before bash 4.4.0
readarray -t -d '' A_Destination_orphans_diff < <(
printf "%s\0" "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" |
sort -z |
uniq -zu
)
else
while IFS= read -r -d $'\0'; do
A_Destination_orphans+=( "$REPLY" )
done < <( find "${directory_PMPRoot_destination}" -type f -print0 )
IFS=$'\37' read -r -d '' -a A_Destination_orphans_diff < <(
printf "%s\0" "${A_Destination_dubUnders[@]}" "${A_Destination_dubUnders[@]}" "${A_Destination_orphans[@]}" |
sort -z |
uniq -zu |
xargs -0 printf '%s\37'
)
fi
if [[ ! "${A_Destination_orphans_diff[*]}" = '' ]] ; then
for (( i = 0 ; i < ${#A_Destination_orphans_diff[@]} ; i++ )) ; do
rm "${A_Destination_orphans_diff[i]}"
done
fi
}