簡體   English   中英

Bash腳本交互式Mv問題

[英]Bash Script interactive mv issues

我正在使用bash腳本來幫助組織文件,並且我想使用mv -i來確保我不會寫一些重要的東西。

除了mv的-i以外,該腳本現在正在運行。

它顯示(y / n [n])沒有被覆蓋的部分,但是隨后又去了,並且不允許我與其交互。

createList()
{
    ls *.epub | sed 's/-.*//' |uniq >> list.txt
    ls *.mobi | sed 's/-.*//' |uniq >> list2.txt
}

atag()
{
    find /Users/j/Desktop/Source -maxdepth 1 -iname "*.epub" -type f -print0 | xargs -0 -I '{}' tag -a Purple {}
    find /Users/j/Desktop/Source -maxdepth 1 -iname "*.mobi" -type f -print0 | xargs -0 -I '{}' tag -a Purple {}
}

moveEpub()
{
    while read -r line; do
        if [ -d "/Users/j/Desktop/Dest/$line" ]; then
            if [ -d "/Users/j/Desktop/Dest/$line/EPUB" ]; then
                find /Users/j/Desktop/Source/ -maxdepth 1 -iname "*$line*" -and ! -iname ".*$line*" -type f -print0 | xargs -0 -I '{}' mv -i {} /Users/j/Desktop/Dest/"$line"/EPUB/
            else
                mkdir "/Users/j/Desktop/Dest/$line/EPUB"
                find /Users/j/Desktop/Source/ -maxdepth 1 -iname "*$line*" -and ! -iname ".*$line*" -type f -print0 | xargs -0 -I '{}' mv -i {} /Users/j/Desktop/Dest/"$line"/EPUB/
            fi
        fi
    done < "list.txt"
}

moveMobi()
{
    while read -r line; do
        if [ -d "/Users/j/Desktop/Dest/$line" ]; then
            if [ -d "/Users/j/Desktop/Dest/$line/MOBI" ]; then
                find /Users/j/Desktop/Source/ -maxdepth 1 -iname "*$line*" -and ! -iname ".*$line*" -type f -print0 | xargs -0 -I '{}' mv -i {} /Users/j/Desktop/Dest/"$line"/MOBI/
            else
                mkdir "/Users/j/Desktop/Dest/$line/MOBI"
                find /Users/j/Desktop/Source/ -maxdepth 1 -iname "*$line*" -and ! -iname ".*$line*" -type f -print0 | xargs -0 -I '{}' mv --interactive {} /Users/j/Desktop/Dest/"$line"/MOBI/
            fi
        fi
    done < "list2.txt"
}

clear
createList
atag
moveEpub
moveMobi
rm list.txt
rm list2.txt

您可以使用內置的find操作-exec而不是傳遞給xargs

find /Users/j/Desktop/Source/ -maxdepth 1 \
    -iname "*$line*" -and ! -iname ".*$line*" -type f \
    -exec mv -i {} /Users/j/Desktop/Dest/"$line"/EPUB/ \;

如果要使mv -i與終端交互,則意味着其stdin需要連接到該終端。 在這里,有幾個地方要覆蓋stdin。


例如:

# THIS LOOP OVERRIDES STDIN
while read -r line
  ...
done <list.txt

...在整個循環過程中重定向stdin,因此mvlist.txt讀取而不是從用戶讀取。 要更改此設置,請使用其他文件描述符:

# This loop uses FD 3 for stdin
while read -r line <&3
  ...
done 3<list.txt

另一個地方是調用xargs 代替:

# Overrides stdin for xargs and mv to contain output from find
find ... -print0 | xargs -0 -I '{}' mv -i '{}' "$dest"

...采用:

# directly executes mv from find, stdin not modified
find ... -exec mv -i '{}' "$dest" ';'

就是說,我建議完全放棄list.txtlist2.txt 您根本不需要它們; 為此,您也不需要find任何內容。

dest=/Users/j/Desktop/Dest
source=/Users/j/Desktop/Source
moveEpub() {
  local -A finished=( )                    # WARNING: This requires bash 4.0 or newer.
  for name in *.epub; do
    prefix=${name%%-*}                     # remove everything past the first dash
    [[ ${finished[$prefix]} ]] && continue # skip if already done with this prefix
    finished[$prefix]=1                    # set flag to skip other files w/ this prefix
    [[ -d $dest/$prefix ]] || continue     # skip if no directory exists for this prefix
    mkdir -p "$dest/$prefix/EPUB"          # create destination if not existing
    mv -i "$source"/*"$prefix"* "$dest/$prefix/EPUB"
  done
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM