以例子簡介 ‘find -ok’ 和 ‘find -okdir’

簡介

在這篇文章中,我們會示範使用 find -okfind -okdir 這兩個指令,這兩個指令跟 find -execfind -execdir 有一樣的功能,不過,在執行指令前,他們先會跟你確認你是否真的想在該檔案上執行該指令,如果你想要更加小心,這些指令會是你的好幫手。

我們已經在這篇文章中解釋過 find -execfind -execdir 之間的分別,今次我們不會再作解釋,如果你有興趣,可以看看該篇文章。

讓我們一起看看這些指令有甚麼不同吧。

  1. 創建以下的檔案架構。
noob@learnfromnoobs:~$ tree find-test/
find-test/
├── dir1
│   └── myfile1
└── dir2
    └── myfile2

2 directories, 2 files

我們可以用以下的指令創建上述檔案架構。

$ mkdir find-test
$ mkdir find-test/dir1
$ mkdir find-test/dir2
$ touch find-test/dir1/myfile1
$ touch find-test/dir2/myfile2

‘find -ok’ vs ‘find -exec’

  1. 在 find-test 下執行 find -exec
noob@learnfromnoobs:~/find-test$ find . -name 'myfile*' -exec ls -l \;
total 8
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir1
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir2
total 8
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir1
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir2
  1. 在 find-test 下執行 find -ok
noob@learnfromnoobs:~/find-test$ find . -name 'myfile*' -ok ls -l \;
< ls ... ./dir1/myfile1 > ? yes
total 8
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir1
drwxrwxr-x 2 noob noob 4096 Mar  7 03:31 dir2
< ls ... ./dir2/myfile2 > ? no

我們可以看到,它會顯示即將執行的的指令(ls)以及將會在哪個檔案上執行,指令只會在得到我們的確認後才會執行。

‘find -okdir’ vs ‘find -execdir’

  1. 在 find-test 下執行 find -execdir
noob@learnfromnoobs:~/find-test$ find . -name 'myfile*' -execdir ls -l \;
total 0
-rw-rw-r-- 1 noob noob 0 Jan 27 09:55 myfile1
total 0
-rw-rw-r-- 1 noob noob 0 Jan 27 09:55 myfile2
  1. 在 find-test 下執行 find -okdir
noob@learnfromnoobs:~/find-test$ find . -name 'myfile*' -okdir ls -l \;
< ls ... ./dir1/myfile1 > ? yes
total 0
-rw-rw-r-- 1 noob noob 0 Mar  7 03:31 myfile1
< ls ... ./dir2/myfile2 > ? no

find -ok 一樣,find -okdir 都會先跟你確認你是否真的想執行該指令,但它跟在確認後,就會跟 find -execdir 一樣,在目標存在的位置執行指令。

總結

總結來說, find -execfind -execdir 擁有跟 find -execfind -execdir 一樣的功能, 但在執行指令前,它們會先要你確認,在上述例子中,你可能會覺得他們的作用不大,但試想想,如果你是在用 rm 來刪除檔案,它們就可以幫你保證你真的知道自己在做甚麼,以免不小心刪除錯檔案。

我希望你喜歡這篇文章,並從中得到新知識。

記得要不斷學習,have fun!

Leave a Reply

Your email address will not be published. Required fields are marked *