我正在尝试编写一个脚本,使tar与文件夹保持同步。我正在处理大量文件,并且不想在每次运行脚本时重新制作tar。我希望它只添加/删除自上次脚本运行以来已从文件夹中添加/删除的tar中的文件。这就是我所拥有的。
# Create tar if it doesn't exist but don't over write if it does exist
touch -a /home/MyName/data.tar
cd /home/MyName
# Make the tar
tar -uv --exclude='dirToTar/FileIWantToExclude' -f $tarFile dirToTar
这适用于添加文件。但是,如果从dirToTar
删除某个文件,则该文件不会从data.tar
中删除。
答案 0 :(得分:0)
如果文件稀疏,也可以使用tar的 -S 选项。
答案 1 :(得分:0)
不幸的是,tar只是不支持此功能。或者,您可以使用zip,如下所示:
class DetailScreen extends StatelessWidget {
// Declare a field that holds the Todo.
final Elevator elevator;
// In the constructor, require a Todo.
DetailScreen({Key key, @required this.elevator}) : super(key: key);
Future _changeStatus(Elevator elevator) async {
//Fetch the data from the api
// ignore: non_constant_identifier_names
var id = elevator.id.toString();
var holder = id.toString();
var url = 'https://rocketcrybaby.azurewebsites.net/api/elevators/'+holder;
var response = await http.put(
url, body: {'status': '${_statusController.text}'});
if (_statusController.text != "active"|| _statusController.text != "inactive"){
return "Error not a valid status !";
}
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
//print(await http.read('https://example.com/foobar.txt'));
return "sucess";
}
@override
Widget build(BuildContext context) {
// Use the Todo to create the UI.
return Scaffold(
appBar: AppBar(
title: Text("Elevator # " +elevator.id.toString()),
),
body: Center(
child: Center(
child: TextField(
controller: _statusController
),
)
),
floatingActionButton: FloatingActionButton(onPressed: () async => [ await _changeStatus(elevator), print(elevator.status)]),
);
}
并非您所要求的“ tar”,但它确实可以很好地工作。另一种选择是使用7z(7-zip存档程序),它可以为您提供更好的压缩效果。这样做的命令行选项比较晦涩,但这有效:
zip -r -FS myArchiveFile.zip dirToZip
(我在这里找到了这些7z命令行选项的文档:https://www.scottklement.com/p7zip/MANUAL/switches/update.htm。我不知道为什么这么难找到这份文档...)。
如果由于某种原因,您不希望zip或7z提供压缩功能,那么也可以禁用它,因此zip或7z就像tar一样创建文件容器。
不过,最后,我认为您应该每次都重新创建存档。我怀疑执行您要求的同步所节省的时间可能很小。