我有(好吧,我有)一个目录:
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud)
它的大小约为 49GB,其中包含数万个文件。该目录是活动 LUKS 分区的挂载点。
我想将目录重命名为:
/media/admin/my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)
我当时没有意识到,但我从主目录发出了命令,所以我最终做了:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)
然后mv程序开始移动,/media/admin/my_data并将其内容移动到一个新目录~/my_data_on_60GB_partition。
我使用Ctrl+C来取消命令,所以现在我有一大堆跨目录的文件:
~/my_data_on_60GB_partition <--- about 2GB worth files in here
Run Code Online (Sandbox Code Playgroud)
和
/media/admin/my_data <---- about 47GB of orig files in here
Run Code Online (Sandbox Code Playgroud)
新目录~/my_data_on_60GB_partition及其一些子目录归 root 所有。
我假设mv程序最初必须以 root 身份复制文件,然后在传输后将chown它们复制回我的用户帐户。
我有一个目录/分区的旧备份。
我的问题是,是否有可能可靠地恢复移动的一堆文件?
也就是说,我可以运行:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
Run Code Online (Sandbox Code Playgroud)
或者我应该放弃尝试恢复,因为文件可能已损坏和部分完整等?
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud) 当从命令提示符启动脚本时,shell 将为该脚本生成一个子进程。我想ps在树形输出中展示终端级进程与其子进程之间的关系。
我怎样才能做到这一点?
到目前为止我尝试过的
文件: script.sh
#!/bin/bash
ps -f -p$1
Run Code Online (Sandbox Code Playgroud)
然后我从命令行调用脚本并传入终端 shell 的进程 ID:
$ ./script.sh $$
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的
ps命令本身的过程#!/bin/bash
ps -f -p$1
Run Code Online (Sandbox Code Playgroud)
我得到的是:
PID TTY STAT TIME COMMAND
14492 pts/24 Ss 0:00 -bash
Run Code Online (Sandbox Code Playgroud) 我试图了解xxx.iso文件与块设备的其他方面(例如分区和文件系统)之间的关系。
人们通常将访问或制作.iso可用描述为“安装 ISO”。
因此,换一种方式提出问题:如果我或某个软件想将xxx.iso文件“挂载”到 USB 设备上,是否需要预先存在的分区和文件系统(例如 FAT x或 ext X)或者.iso文件 - 一旦处于“挂载”状态 - 执行与文件系统(甚至分区)相同/相似角色的较低级别构造?
bash 解释器本身有选项,即
bash 手册页的第 22-23 行:
Run Code Online (Sandbox Code Playgroud)OPTIONS All of the single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked. In addition, bash interprets the following options when it is invoked: -c ... -i ... -l ... -r ...
我在 bash 手册页中使用了一些搜索模式,例如:
/^\s*set/list是否可以打印应用于当前 shell 的这些设置的列表?
“crontab”或“inittab”中的“tab”是什么意思?
了解其含义可能有助于对包含“tab”后缀的文件进行心理分类,并了解它们与操作系统其他部分的关系。
一些文件复制程序喜欢rsync并且curl能够恢复失败的传输/复制。
请注意,这些失败的原因可能有很多,在某些情况下,程序可以进行“清理”,而在某些情况下则不能。
当这些程序恢复时,它们似乎只是计算成功传输的文件/数据的大小,然后开始从源读取下一个字节并附加到文件片段。
例如,“制作”到目的地的文件片段的大小是 1378 字节,因此它们只是从原始文件的第 1379 字节开始读取并添加到片段中。
我的问题是,知道字节由位组成,并且并非所有文件都将其数据分段为干净的字节大小的块,这些程序如何知道他们选择开始添加数据的点是正确的?
当写入目标文件时,会发生类似于 SQL 数据库的某种缓冲或“事务”,无论是在程序、内核还是文件系统级别,以确保只有干净、格式良好的字节才能到达底层块设备?
或者程序是否假设最新的字节可能不完整,所以他们在假设它坏的情况下删除它,重新复制字节并从那里开始附加?
知道并非所有数据都表示为字节,这些猜测似乎不正确。
当这些程序“恢复”时,他们怎么知道他们是从正确的地方开始的?
在下面的脚本中——它会提示用户确认他们想要继续运行一个潜在的错误脚本——当用户Y在提示处输入时——它将跳出case块,只会再次被送回while循环。
#! /bin/bash
set -e
echo
echo "bad install start"
echo "-----------------------------------------"
while true; do
read -p "this script will probably fail - do you want to run anyway?" yn
case $yn in
[Yy]*)
##### WHAT GOES HERE?? #####
;;
[Nn]*)
exit ;;
*)
echo "answer y or n" ;;
esac
echo "script has broken out of case back into while loop"
done
echo -e "\e[33m Installing bad packagename \e[0m"
apt-get install sdfsdfdfsd
echo …Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本,它使用set -o errexit以便在出错时整个脚本在故障点退出。
该脚本运行的curl命令有时无法检索预期文件 - 但是当发生这种情况时,脚本不会错误退出。
我添加了一个for循环
curl命令false在 for 循环的底部使用来定义默认的非零退出状态 - 如果 curl 命令成功 - 循环中断并且最后一个命令的退出状态应该为零。#! /bin/bash
set -o errexit
# ...
for (( i=1; i<5; i++ ))
do
echo "attempt number: "$i
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
if [ -f ~/.vim/autoload/pathogen.vim ]
then
echo "file has been retrieved by curl, so breaking now..."
break;
fi
echo "curl'ed file doesn't yet exist, so now will wait 5 seconds …Run Code Online (Sandbox Code Playgroud) 我想将一个命令放入一个 shell 脚本中,该脚本将创建一个指向目录的符号链接,但该脚本可以一遍又一遍地运行,因此在后续调用中,该命令不应更改任何内容。
这是目录结构:
% tree /tmp/test_symlink
/tmp/test_symlink
??? foo
??? repo
??? resources
??? snippets
??? php.snippets
??? sh.snippets
??? snippets.snippets
??? sql.snippets
??? vim.snippets
Run Code Online (Sandbox Code Playgroud)
我想在foo/指向目录的调用片段中创建一个符号链接/tmp/test_symlink/repo/resources/snippets。
所以我运行:
% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets'
Run Code Online (Sandbox Code Playgroud)
这给出了预期的结果。
% tree /tmp/test_symlink
/tmp/test_symlink
??? foo
? ??? snippets -> /tmp/test_symlink/repo/resources/snippets
??? repo
??? resources
??? snippets
??? php.snippets
??? sh.snippets
??? snippets.snippets
??? sql.snippets
??? vim.snippets
Run Code Online (Sandbox Code Playgroud)
5个目录,5个文件
但是,当再次运行该命令时,
% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets/snippets' -> '/tmp/test_symlink/repo/resources/snippets'
Run Code Online (Sandbox Code Playgroud)
它创建一个指向目录的符号链接,其中符号链接 aleady …
我在 SQLite 命令提示符下编写命令时犯了一个错误,我现在想中止,这就是我的命令行的外观
sqlite> select * from todos'
...> '
...> ;^C
Run Code Online (Sandbox Code Playgroud)
在这种情况下,可能是因为我打开了一个引号,我什ENTER至无法运行命令。我只是得到一个行延续,这仍然不太理想,因为我将不得不运行错误的代码和原因和错误,只是为了重新控制提示。
如何取消行/命令并返回到提示?
bash ×3
shell-script ×3
command-line ×1
file-copy ×1
files ×1
filesystems ×1
iso ×1
line-editor ×1
mv ×1
ps ×1
shell ×1
shopt ×1
sqlite ×1
symlink ×1
terminology ×1