
我有一個路徑 /participant/data,其中所有檔案都位於資料目錄中。但是,我希望目錄結構為 /participant/data/subdirectory,其中子目錄包含所有檔案。它需要像這樣才能通過管道。
我的第一個想法是
mkdir /參與者/資料/子目錄/
mv /參與者/資料/*.* /參與者/資料/子目錄/
但是,這些檔案沒有檔案副檔名,因此使用 *.* 不起作用。關於如何執行此操作有什麼建議嗎?
答案1
只需移動所有內容:
mv /participant/data/* /participant/data/subdirectory/
這會抱怨無法移動subdirectory
到自身,但仍會以您想要的方式將其他所有內容移至該子目錄中。
Bashshopt -s extglob
添加了一些額外的通配符,例如!(xy|z)
匹配所有內容,例如*
除了 xy
或者z
:
shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/
(Zsh 可能有更多擴充通配符,只能匹配檔案。)
如果您有更多子目錄並且不想觸及它們,find
則fd
可以使用 或 等工具僅對特定項目進行操作,在本例中僅對文件進行操作:
find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;
mv -t
使用and會稍微更有效-exec +
:
find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +
前面的(較慢的)範例也可以寫成 shellfor
循環:
for x in /participant/data/*; do
if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done
答案2
您可以使用*
而不是*.*
包含與檔案名稱無關的所有檔案。
但這也包括目錄,也包括subdirectory
,因此在移動文件時必須排除它。
這可以透過擴展模式匹配功能來實現。首先,您必須啟用它們(對於當前會話):
$ shopt -s extglob
然後您可以使用以下命令來處理除一個文件之外的所有文件path/!(excludedFile)
實施於mv
:
$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/
還有更多選項可以移動除一個文件之外的所有文件:https://www.baeldung.com/linux/move-all-files- except-one
答案3
對於您所描述的情況,最簡單的方法是:
cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory
* 將符合所有未隱藏的目錄條目,即所有不以點開頭的目錄條目。由於我們暫時以點開頭子目錄名稱,因此它不匹配,並且資料中的所有條目都將被移動。現在,如果您有一些不想移動的條目(例如其他子目錄),則必須使用更複雜的方法,例如 user1686 的詳細答案中的方法。