Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将每个包含文件路径的两个数组区分为第三个数组(用于删除)_Arrays_Bash - Fatal编程技术网

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
a
null
分隔条目流


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 
}