
我正在幫助我的女朋友舉辦一個活動,她必須用相同的文件加載大約 1,000 個 USB 隨身碟。
這是一個相當小的檔案(只有幾 MB),但繁瑣的部分實際上是複製檔案。
有沒有辦法在插入 USB 隨身碟時自動將檔案複製到 USB 隨身碟?這將使她的工作變得非常輕鬆。
我的桌面作業系統是 Windows 10,但我也可以存取 Linux。我甚至不會反對為 Linux 編寫 bash 腳本,如果那樣更容易的話。
答案1
在 Ubuntu 16.04 上,USB 隨身碟安裝在 中/media/$USER/LabelName
,但可以在不知情的情況下處理檔案複製。一個粗略的腳本是:-
#!/bin/bash
while sleep 1
do [ -e /media/$USER/*/TheFile ] || cp TheFile /media/$USER/*/
umount umount /media/$USER/*
xmessage -center -timeout 3 "File copied - change disc"
done
這只是為了展示原理。您需要做的一件事是確保/media/$USER/
在開始之前沒有安裝任何東西(除非您已經安裝了第一個驅動器)。您可以替換TheFile
為參數或預設環境變量,但請確保它位於目前目錄中,這樣就沒有路徑,否則檢查其在磁碟機上是否存在將會失敗。
您也許可以在 Ubuntu Live 光碟上完成所有這些操作,而無需安裝,但是您需要檢查筆式驅動器的安裝位置,並在必要時修改腳本;我也不確定是否xmessage
包含在 Live 光碟上,因此您可能需要安裝它,除非您使用其他方法來指示驅動器需要更改。
答案2
的延伸AFH的基本理念,假設您的 Linux 作業系統會自動安裝快閃磁碟機/media/$USER
。
#! /bin/bash
src="$1"
target="$(basename "$src")"
counter=0
copyTo() {
sleep 0.3 # wait for drive to be fully mounted
printf -v offset '%*s' $(( counter * 15 % ($(tput cols) - 15) ))
echo "$offset Copy to $counter"
cp "$src" "$1/$target"
sync "$1"
umount "$1"
echo "$offset Unmounted $counter"
}
inotifywait -me create --format "%w%f" "/media/$USER" |
while IFS='' read -r drive; do
((++counter))
copyTo "$drive" &
done
用法
inotifywait
如果尚未安裝,請安裝。在 Ubuntu 上使用sudo apt install inotify-tools
這樣做。- 設定您的檔案總管(例如 nemo 或 nautilus)以不是自動開啟安裝的磁碟機。
umount
如果檔案總管視窗顯示要卸載的磁碟機的內容,則可能會失敗。 - 將腳本另存為
autocopy.sh
. - 使用使腳本可執行
chmod u+x autocopy.sh
- 使用啟動腳本
./autocopy.sh '/path/to/file.ext'
- 根據需要插入任意數量的 USB 隨身碟。該腳本會在磁碟機插入時偵測它們,將檔案複製到它們,然後卸載它們。
- 完成後,點選CtrlC退出腳本。
輸出
該腳本在複製檔案之前和卸載磁碟機之後列印。相關訊息在同一層級縮排。
Copy to 1
Unmounted 1
Copy to 2
Copy to 3
Unmounted 3
Unmounted 2
Copy to 4
Unmounted 4
這些數字可能不可靠。如果將同一根棍子插入兩次,則算兩次。